• Publicidad

Ayuda con error 'undefined subroutine'

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Ayuda con error 'undefined subroutine'

Notapor aLiSH » 2007-05-23 04:49 @242

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:

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
 Undefined subroutine &main::save_result called at
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


En la línea del error está:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
save_result ($obj,$form,$outfileformat,$name);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


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):

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
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);
        }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Las otras funciones a las que llama son las siguientes:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
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;
        }
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Os agradecería cualquier idea o ayuda para resolverlo.
Un saludo.
aLiSH
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2007-05-08 05:57 @290

Publicidad

Notapor explorer » 2007-05-23 05:07 @254

¿Está la llamada a la función en el mismo fichero que su definición?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor aLiSH » 2007-05-23 05:29 @270

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

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
do './perl_functions.pl';
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
do '../perl_functions.pl';
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


He vuelto a probar y me devuelve otro error:

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
Undefined subroutine &main::scan_dir
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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:

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
Not a GLOB reference at ../perl_functions.pl line 70.
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


donde pone: write (FILENAME, $result);

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

Muchas gracias explorer.
aLiSH
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2007-05-08 05:57 @290

Notapor aLiSH » 2007-05-23 05:42 @279

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.
aLiSH
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2007-05-08 05:57 @290

Notapor explorer » 2007-05-23 05:52 @286

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?
Última edición por explorer el 2008-09-01 17:14 @760, editado 1 vez en total
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor aLiSH » 2007-05-23 06:03 @294

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

print (FILENAME %$result); ??

Muchas gracias.
aLiSH
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2007-05-08 05:57 @290

Notapor aLiSH » 2007-05-23 08:33 @398

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.
aLiSH
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2007-05-08 05:57 @290

Notapor explorer » 2007-05-23 08:46 @407

Pero es que depende de lo que quieres hacer. ¿Quieres imprimir un hash completo? Puedes usar la función Dump del Data::Dumper;
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor explorer » 2007-05-23 08:51 @410

Pero... ¿en qué lugar del programa actualizas el contenido de la variable $result? Yo no lo veo por ningún lado.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor aLiSH » 2007-05-23 08:51 @410

Si, quiero imprimirlo completo. Probaré con esa funcion. Muchas gracias.
aLiSH
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2007-05-08 05:57 @290


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados

cron