• Publicidad

Problema pasando parámetros a procedimientos

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Problema pasando parámetros a procedimientos

Notapor ivanlog19 » 2009-09-22 17:12 @758

Hola, tengo problemas al pasar parámetros a subrutinas que tengo definidas en otros módulos (paquetes).

Ejemplo 1:
Quiero pasarle como parámetro a la función "parsear_por_nombre" el nombre del archivo, o sea, una cadena de caracteres, no una referencia. ¿Cómo hago?
Esto es lo que tengo hecho:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
opendir(DIRHANDLE,"$ruta")||die"ERROR: no se pudo leer el directorio";

foreach (readdir(DIRHANDLE)){
        my $nombreArchivo = $_;
       
        if (!($nombreArchivo eq "." || $nombreArchivo eq "..")){
                my $datos = $procesador->parsear_por_nombre($nombreArchivo)
        }
}
 
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Ejemplo 2:
Quiero pasarle como parámetro a la función "parsear_archivo" un filehandle del archivo, o sea que, dentro de esta función, pueda acceder línea por línea del archivo usando <$archivo>. ¿Cómo hago?
Esto es lo que tengo hecho:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
opendir(DIRHANDLE,"$ruta")||die"ERROR: no se pudo leer el directorio";

foreach (readdir(DIRHANDLE)){
        my $nombreArchivo = $_;
       
        if (!($nombreArchivo eq "." || $nombreArchivo eq "..")){
                open(my $archivo, "$ruta$nombreArchivo");
                my $datos = $procesador->parsear_archivo($archivo)
        }
}
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¡Gracias!
Última edición por explorer el 2009-09-22 18:15 @802, editado 2 veces en total
Razón: Bloques de código
ivanlog19
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2009-09-18 15:24 @683
Ubicación: Montevideo - Uruguay

Publicidad

Re: Problema pasando parametros a procedimientos

Notapor explorer » 2009-09-22 18:13 @801

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
opendir (my $dirh, $ruta) or die"ERROR: no se pudo leer el directorio";

while (my $nombreArchivo = readdir $dirh) {
    next if $nombreArchivo eq '.';
    next if $nombreArchivo eq '..';

    my $datos = $procesador->parsear_por_nombre($nombreArchivo);
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Yo no veo problemas en tu código... ¿qué errores te da?

Lo único así raro es que podrías colocar el open() del $archivo dentro de la función parsear_archivo(). Mejor dicho, el open(), el <> y el close().

Si no ves el error intenta mostrar el código de las funciones. O el mensaje de error que Perl te devuelve. Activa el warnings y el diagnostics.
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

Re: Problema pasando parametros a procedimientos

Notapor ivanlog19 » 2009-09-22 18:29 @811

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
opendir (my $dirh, $ruta) or die"ERROR: no se pudo leer el directorio";

while (my $nombreArchivo = readdir $dirh) {
    next if $nombreArchivo eq '.';
    next if $nombreArchivo eq '..';

    print "$nombreArchivo\n"; #1er impresión
    my $datos = $procesador->parsear_por_nombre($nombreArchivo);
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub parsear_por_nombre{
    my $file_name = shift;
    print "$file_name\n"; #2da impresión
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Puede ser que el problema sea que la función parsear_por_nombre() es de otro módulo?

Agregué esos print() en los códigos; el primer print() me imprime efectivamente el nombre del archivo, pero el segundo (que está dentro de otro módulo en la subrutina "parsear_por_nombre") me imprime "MKT::ProcesamientoDatos=HASH(0x347b5c8)". MKT::procesamientoDatos es el módulo que me definí que contiene a la subrutina parsear_por_nombre().
Última edición por ivanlog19 el 2009-09-23 10:11 @466, editado 3 veces en total
ivanlog19
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2009-09-18 15:24 @683
Ubicación: Montevideo - Uruguay

Re: Problema pasando parámetros a procedimientos

Notapor explorer » 2009-09-22 19:34 @857

¿Por qué pones \shift? ¿No será, simplemente, shift?
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

Re: Problema pasando parámetros a procedimientos

Notapor ivanlog19 » 2009-09-22 20:15 @885

Si, tienes razón.

Fue un error mio al escribir el post anterior, ya lo edité.
En el programa puse solo shift, no \shift.

¿Alguien sabe dónde está el problema?

PD: Gracias, explorer, por responder siempre tan rápido.
ivanlog19
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2009-09-18 15:24 @683
Ubicación: Montevideo - Uruguay

Re: Problema pasando parámetros a procedimientos

Notapor explorer » 2009-09-23 02:42 @154

La función que has puesto se llama parcear(), que no es parsear_por_nombre() ni parsear_archivo().
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

Re: Problema pasando parámetros a procedimientos

Notapor ivanlog19 » 2009-09-23 10:14 @468

Ese fue otro error al escribir el post. En el programa lo tengo bien.

¿Nadie sabe cuál es el problema?

-Ya corregí el nombre del procedimiento en el post-
ivanlog19
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2009-09-18 15:24 @683
Ubicación: Montevideo - Uruguay

Re: Problema pasando parámetros a procedimientos

Notapor ivanlog19 » 2009-09-23 10:32 @480

La función parsear_por_nombre() es un procedimiento de una clase.
¿Puede ser que tenga algo que ver?

A continuación pongo los códigos un poco más detallado (incluyo el procedimiento constructor de la clase).

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $procesador = MKT::ProcesamientoDatos->newProcesador();

opendir (my $dirh, $ruta) or die"ERROR: no se pudo leer el directorio";
while (my $nombreArchivo = readdir $dirh) {
    next if $nombreArchivo eq '.';
    next if $nombreArchivo eq '..';

    print "$nombreArchivo\n"; #1er impresión
    my $datos = $procesador->parsear_por_nombre($nombreArchivo);
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub newProcesador {
    my $class=shift;           
    my $self = {};     

    bless ($self, $class); # Perl nos tiene que dar el visto bueno (bendecirla)
    return ($self);        # Devolvemos la clase recién construida
}

sub parsear_por_nombre{
    my $file_name = shift;
    print "$file_name\n"; #2da impresión
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
ivanlog19
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2009-09-18 15:24 @683
Ubicación: Montevideo - Uruguay

Re: Problema pasando parámetros a procedimientos

Notapor explorer » 2009-09-23 11:39 @527

Sí, el problema está en la definición de la función parsear_por_nombre().

Al llamarla como $procesador->parsear_por_nombre($nombreArchivo);, perl está metiendo en la pila de argumentos, además de $nombreArchivo, el valor del objeto al que estamos haciendo referencia: $procesador. Así que hay que sacarlos en ese orden:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. use MKT::ProcesamientoDatos;
  7.  
  8. my $procesador = MKT::ProcesamientoDatos->newProcesador();
  9.  
  10. my $ruta = '.';
  11.  
  12. opendir (my $dirh, $ruta) or die"ERROR: no se pudo leer el directorio";
  13. while (my $nombreArchivo = readdir $dirh) {
  14.     next if $nombreArchivo eq '.';
  15.     next if $nombreArchivo eq '..';
  16.  
  17.     print "1. $nombreArchivo\n"; #1er impresión
  18.     my $datos = $procesador->parsear_por_nombre($nombreArchivo);
  19. }
  20.  
  21. __END__
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. package MKT::ProcesamientoDatos;
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. sub newProcesador {
  7.     my $class=shift;
  8.     my $self = {};
  9.  
  10.     bless ($self, $class); # Perl nos tiene que dar el visto bueno (bendecirla)
  11.     return ($self);        # Devolvemos la clase recién construida
  12. }
  13.  
  14. sub parsear_por_nombre{
  15.     my $self      = shift;
  16.     my $file_name = shift;
  17.     print "2. $file_name\n"; #2da impresión
  18. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


$self almacenará el valor de $procesador, por si necesitamos referirnos al hash bendecido que almacena las propiedades del objeto. Los argumentos de la función estarán a partir de ese primer argumento.

Ahora bien, lo que también podemos hacer es integrar la función dentro del espacio de nombres del programa. Quedaría así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. use MKT::ProcesamientoDatos 'parsear_por_nombre';
  7.  
  8. my $ruta = '.';
  9.  
  10. opendir (my $dirh, $ruta) or die"ERROR: no se pudo leer el directorio";
  11. while (my $nombreArchivo = readdir $dirh) {
  12.     next if $nombreArchivo eq '.';
  13.     next if $nombreArchivo eq '..';
  14.  
  15.     print "1. $nombreArchivo\n"; #1er impresión
  16.     my $datos = parsear_por_nombre($nombreArchivo);
  17. }
  18.  
  19. __END__
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Y el módulo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. package MKT::ProcesamientoDatos;
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. require Exporter;
  7. our @ISA = qw(Exporter);
  8. our @EXPORT_OK = qw(parsear_por_nombre);
  9.  
  10. sub newProcesador {
  11.     my $class=shift;
  12.     my $self = {};
  13.  
  14.     bless ($self, $class); # Perl nos tiene que dar el visto bueno (bendecirla)
  15.     return ($self);        # Devolvemos la clase recién construida
  16. }
  17.  
  18. sub parsear_por_nombre{
  19.     my $file_name = shift;
  20.     print "2. $file_name\n"; #2da impresión
  21. }
  22.  
  23. 1;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

El resultado será el mismo. Puedes decidir si quieres trabajar orientado a objetos o aumentar la funcionalidad de Perl incorporando más funciones.
Última edición por explorer el 2009-09-23 12:47 @574, editado 1 vez en total
Razón: Números de línea en el módulo
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

Re: Problema pasando parámetros a procedimientos

Notapor ivanlog19 » 2009-09-23 11:59 @541

¡Excelente!

Gracias explorer, ese era el problema.

Ya pueden cerrar el tema y ponerle el cartelito de "RESUELTO".
ivanlog19
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2009-09-18 15:24 @683
Ubicación: Montevideo - Uruguay

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Bing [Bot] y 7 invitados