Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Ayuda con error 'undefined subroutine'

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio
Mensaje Mie May 23, 2007 3:49 am
aLiSH
Perlero Nuevo
Perlero Nuevo
Registrado: 08 May 2007
Mensajes: 18
Ayuda con error 'undefined subroutine' Responder citando

Hola!

Llevo poco tiempo con Perl y estoy probando unas subrutinas que escribí. Me encuentro con el siguiente error, que no entiendo muy bien a que se debe:

bash:
Undefined subroutine &main::save_result called at


En la línea del error está:

Perl:
save_result ($obj,$form,$outfileformat,$name);


y la función es la siguiente (dentro llama a otras funciones y me temo que el error pueda ser a las referencias de las variables):

Perl:
sub save_result {
        my ($result,$form,$ext,$name) = @_;
        my $today = strftime "%Y_%m_%d", localtime;
        my $now = strftime "%H_%M_%S", localtime;
        # get path information
        chdir '/tmp/';
        scandir();
        my $folder='results';
        check_folder($folder,\@$dirlist);
        chdir './results/';
        scan_dir();
        # check if today user's folder already exists
        $folder=''.$name.'_'.$today.'';
        check_folder($folder,$dirlist);
        # write result into a file, $form, $name, $now
        chdir(''.$name.'_'.$today.'');
        my $filename = 'result_'.$form.'_'.$name.'_'.$now.'.'.$ext.'';
        open (FILENAME, ">$filename");
        write (FILENAME, $result);
        close(FILENAME);
        }


Las otras funciones a las que llama son las siguientes:

Perl:
sub scandir {
        my $dir ='.'; # actual dir
        opendir(DIR, $dir) || die "can't opendir $dir: $!";
        my @list = readdir (DIR);
       
        foreach $item (@list){
                push @dirlist, $item if -d "$dir/$item" && $item ne '.' && $item ne '..';
                push @filelist, $item if -f "$dir/$item";
        }
        $dirlist = \@dirlist;
        $filelist = \@filelist;
        return($dirlist, $filelist);
}

sub check_folder {
        my ($folder, $dirlist) = @_;
        my $i=0;
        my $found='FALSE';
        $dir_size = @dirlist;
        while($found eq 'FALSE' && $i<=$dir_size){
                if ($dirlist[$i] eq $folder){
                        $found='TRUE';
                }
        $i++;
        }
        if ($found eq 'FALSE') {
                mkdir $folder;
        }
}


Os agradecería cualquier idea o ayuda para resolverlo.
Un saludo.
Mensaje Mie May 23, 2007 4:07 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4226
Ubicación: Valladolid, España
Responder citando

¿Está la llamada a la función en el mismo fichero que su definición?
Mensaje Mie May 23, 2007 4:29 am
aLiSH
Perlero Nuevo
Perlero Nuevo
Registrado: 08 May 2007
Mensajes: 18
Responder citando

No, en el fichero que llama a la función, al principio, he puesto:

Perl:
do './perl_functions.pl';


Donde se encuentran definidas todas las subrutinas. El path estaba incorrecto. Lo he corregido por:

Perl:
do '../perl_functions.pl';


He vuelto a probar y me devuelve otro error:

bash:
Undefined subroutine &main::scan_dir


Que indica la línea donde se llama al segundo scan_dir() dentro de la función save_result(). Y me acabo de dar cuenta de que esta mal referenciada porque la función se llama scandir() y no scan_dir()...

Siguiendo con las pruebas y errores, una vez corregido lo anterior, me da otro error:

bash:
Not a GLOB reference at ../perl_functions.pl line 70.


donde pone: write (FILENAME, $result);

Aqui ya si que no se me ocurre como solucionarlo. Alguna idea??

Muchas gracias explorer.
Mensaje Mie May 23, 2007 4:42 am
aLiSH
Perlero Nuevo
Perlero Nuevo
Registrado: 08 May 2007
Mensajes: 18
Responder citando

Hola de nuevo,

He modificado "write (FILENAME, $result);" por "write (FILENAME, %$result);" ya que la variable $result realmente es un hash. Lo que ocurre es que no me aparece ningún error pero no me escribe o guarda el fichero ya que no lo encuentro ni en la carpeta donde debería guardarlo ni en la carpeta donde esta el script.
Mensaje Mie May 23, 2007 4:52 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4226
Ubicación: Valladolid, España
Responder citando

write() sirve para la salida con un formato definido para el manipulador de fichero FILENAME. ¿Tienes definido un format para FILENAME? ¿No será print FILENAME lo que quieres usar?

Ultima edición por explorer el Lun Sep 01, 2008 4:14 pm, editado 1 vez
Mensaje Mie May 23, 2007 5:03 am
aLiSH
Perlero Nuevo
Perlero Nuevo
Registrado: 08 May 2007
Mensajes: 18
Responder citando

Pues igual es esa función... aunque no se como tendría que escribirlo:

print (FILENAME %$result); ??

Muchas gracias.
Mensaje Mie May 23, 2007 7:33 am
aLiSH
Perlero Nuevo
Perlero Nuevo
Registrado: 08 May 2007
Mensajes: 18
Responder citando

He probado con "print FILENAME %$result;" y me sigue sin aparecer el archivo. He comprodado que hasta el punto donde comienza a abrir el fichero el script funciona correctamente.

Mi duda es si al ser mi variable a imprimir un hash y al querer que se imprima tal cual, no lo lea o pueda escribir. Estoy leyendo cosas de manejo de ficheros pero no encuentro nada que me pueda ayudar en este caso concreto. Alguna idea?

Un saludo.
Mensaje Mie May 23, 2007 7:46 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4226
Ubicación: Valladolid, España
Responder citando

Pero es que depende de lo que quieres hacer. ¿Quieres imprimir un hash completo? Puedes usar la función Dump del Data::Dumper;
Mensaje Mie May 23, 2007 7:51 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4226
Ubicación: Valladolid, España
Responder citando

Pero... ¿en qué lugar del programa actualizas el contenido de la variable $result? Yo no lo veo por ningún lado.
Mensaje Mie May 23, 2007 7:51 am
aLiSH
Perlero Nuevo
Perlero Nuevo
Registrado: 08 May 2007
Mensajes: 18
Responder citando

Si, quiero imprimirlo completo. Probaré con esa funcion. Muchas gracias.
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group