• Publicidad

Usar parametros por referencia desde una funcion

¿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.

Usar parametros por referencia desde una funcion

Notapor d2bit » 2006-01-17 11:19 @513

Buenas, quiera poder modificar un vector por referencia.

Y no me aclaro.

lo estoy intentando pasar con &funcion(\@vector);

pero no consigo trabajar con el contenido de la referencia.

No se si no se debe hacer así, o que. Lo he intentado con @$_, pero no me lo coje bien. sin embargo desde la función si que puedo imprimir el valor de la referencia ARRAY(0x285d0c), pero al contenido de dicho array ya no llego.

Necesito un cable. Gracias
Avatar de Usuario
d2bit
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2006-01-13 07:12 @341

Publicidad

Notapor Perl user » 2006-01-17 12:08 @547

Que tal,

Es muy importante recalcar sobre la sintaxis de tu llamado "&funcion(args)", ya hace mas que invocar a la función con dichos parámetros, la llamada debe de ser "funcion(args) simplemente".

Sobre el paso de referencias, lo estás haciendo de la manera correcta, es decir, \@arr pasa una referencia del array @arr. Sin embargo tu problema está en la función al intentar utilizar los elementos de la referencia.

Código: Seleccionar todo
sub foo {
    my ( $arr ) = @_ # o bien my $arr = shift;
    foreach my $elem ( @$arr ) {
        $elem++;
        print $elem, "\n";
    }
}

@arr = ( 1, 2, 3, 4 );
foo( \@arr ); # o bien [ 1, 2, 3, 4 ];
print "fuera de la funcion:\n";
print "$_\n" foreach @arr;


Es recomendada la lectura de perldoc perlref, perlreftut y podría serte ùtil perldsc.

Saludos,
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924

Re: Usar parametros por referencia desde una funcion

Notapor explorer » 2006-01-17 12:19 @554

Código: Seleccionar todo
my @dieta = qw(chocolate pan maiz);
come(\@dieta);

sub come {
    my $menu = shift;

    # Acceso a todo el vector
    print join "\n", @$menu;

    # Repetimos un elemento (aquí, el tercero)
    print $menu->[2], "\n";
}
Última edición por explorer el 2006-01-17 13:02 @585, 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: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Perl user » 2006-01-17 12:30 @563

explorer escribiste:
Código: Seleccionar todo
my @dieta = qw(chocolate pan maiz);
come(\@dieta);

sub come {
    my ( $menu ) = shift;

    # Acceso a todo el vector
    print join "\n", @$menu;

    # Repetimos un elemento (aqui, el tercero)
    print $menu->[2], "\n";
}


Hay un pequeño error en tu código ( ambigüedad ), en la línea de:
Código: Seleccionar todo
my ( $menu ) = shift;


Estas asignando al retorno de shift que es un contexto escalar a un contexto de lista, el intérprete sabe de tu falla y lo corrije haciendo lo correcto, pero eso que haces es incorrecto.

Saludos,
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924

Re: Usar parametros por referencia desde una funcion

Notapor explorer » 2006-01-17 13:29 @604

Perl user escribiste:Hay un pequeño error en tu código. Estas asignando al retorno de shift que es un contexto escalar a un contexto de lista, el intérprete sabe de tu falla y lo corrije haciendo lo correcto, pero eso que haces es incorrecto.
Pues no... es correcto...
my es una función. Los paréntesis no indican contexto lista, sino que agrupan los argumentos que le pasamos a my, y sólo son obligatorios si se está declarando más de una variable (ver my() en perldoc). Pero que sea obligatorio no es óbice para que pueda utilizarles incluso con un sólo argumento. Entonces estoy declarando y definiendo un sólo argumento, que recibe el valor del escalar como resultado del shift del @_.
Al menos, lo he ejecutado con los warnings, strict y diagnostics activados y el Perl ni se ha quejado. Y si no se queja, a mi me vale.
Otra cosa es el estilo. Según las últimas prácticas de Damian Comway, lo correcto sería hacer un
Código: Seleccionar todo
my ($menu) = @_;
o
Código: Seleccionar todo
my $menu = shift;
(Página 180 de Perl Best Practices), que es justo como pones en tu ejemplo.
Si yo lo he puesto así, es porque lo he usado durante los últimos años... y claro... es difícil deshacerse de los malos vicios...
Ya está corregido arriba...
(Menos mal que Perl permite hacer correctamente lo incorrecto :) )
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Perl user » 2006-01-17 13:45 @614

explorer escribiste:Pues no... es correcto...
my es una función. Los paréntesis no indican contexto lista, sino que agrupan los argumentos que le pasamos a my, y sólo son obligatorios si se está declarando más de una variable (ver my() en perldoc). Pero que sea obligatorio no es óbice para que pueda utilizarles incluso con un sólo argumento. Entonces estoy declarando y definiendo un sólo argumento, que recibe el valor del escalar como resultado del shift del @_.
Al menos, lo he ejecutado con los warnings, strict y diagnostics activados y el Perl ni se ha quejado. Y si no se queja, a mi me vale.

Pero por supuesto que eso indica un contexto escalar o lista, si ves BIEN el manual de my, my CREA una o varias ( lista, te lo indica perfectamente ) de variables léxicas, y si tu comentario lo documentas en perldoc perlsub podrás ver que EFECTIVAMENTE es una lista y un contexto lista lo que tienes cuando my tiene () para su creación;

No solo está documentado allí, también como mencionas está documentado en Perl Best Practices ( que está muy trillado ) y en Higher-Order Perl.

Si Perl no te marcó nada es por lo que te dije anteriormente... y si quieres ver que realmente mi comentario es certero puedes ver el código generado por esa expresion con B::Terse.

Qué pasa en este caso?
Código: Seleccionar todo
my ( $a, $b ) = 1;
my @c = undef; # otro caso similar y que tienen la misma validez.
print $b;


Solo dime que hace eso, y podrás ver lo que te digo.



explorer escribiste:Otra cosa es el estilo. Según las últimas prácticas de Damian Comway, lo correcto sería hacer un
Código: Seleccionar todo
my ($menu) = @_;
o
Código: Seleccionar todo
my $menu = shift;
(Página 180 de Perl Best Practices), que es justo como pones en tu ejemplo.
Si yo lo he puesto así, es porque lo he usado durante los últimos años... y claro... es difícil deshacerse de los malos vicios...
Ya está corregido arriba...
(Menos mal que Perl permite hacer correctamente lo incorrecto :) )


Estilo? muy probablemente, pero el estilo califica la experiencia de un programador también. Recomiendo la lectura de "Effective Perl Programming" por Addison Wesley.

saludos,
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924

Re: Usar parametros por referencia desde una funcion

Notapor explorer » 2006-01-17 15:14 @676

Perl user escribiste:Si Perl no te marcó nada es por lo que te dije anteriormente... y si quieres ver que realmente mi comentario es certero puedes ver el código generado por esa expresion con B::Terse.
Solo dime que hace eso, y podrás ver lo que te digo.

Pero si estoy de acuerdo contigo, Marco... pero... ahora verás de dónde ha venido el problema mío...
Perl user escribiste:
explorer escribiste:Otra cosa es el estilo. Según las últimas prácticas de Damian Comway, lo correcto sería hacer un

Estilo? muy probablemente, pero el estilo califica la experiencia de un programador también. Recomiendo la lectura de "Effective Perl Programming" por Addison Wesley.

Pues entonces tenemos un problema, Marco... :wink:
Resulta que yo he aprendido Perl, a parte de leer tutoriales, manuales y libros, leyendo código... y...
En todo CPAN aparecen más de 10.000 veces la forma my ($var) = shift;
Incluso hasta el mismo Damian Conway tiene uno en el módulo del 22 de mayo del año pasado, llamado IO::Interactive, dos meses antes de la salida del libro.
Es por eso por lo que desde hace mucho tiempo usaba esa construcción. Pero puedo estar de acuerdo contigo en que está mal.
Pero 10.000 apariciones son muchas. La que se lleva la palma, es, naturalmente:my($self)=shift;, que aparece más de 4600 veces.
Lo que está más cuidado es la documentación en pod... sólo aparece el "error" en 3 documentos: perlcall, perlfilter y perlunicode.
Prestaremos más atención a partir de ahora...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Perl user » 2006-01-17 15:28 @686

No, no intento decirte que estas MAL, te dije que expresarlo de la manera en que lo hacías era incorrecta, la mejor prueba de que funciona es que el intérprete lo hace funcionar, y si pasa eso, entonces como dices no importa.

Mencionaste la palabra "estilo", y bueno, ya lo leíste de un libro, ya lo comenté y la conclusión pues siempre ha sido de generar buen código.

Esa es la finalidad del comentario, no de decirte que estás mal, y que todo lo que has aprendido hasta ahorita está mal y que tienes que volver a reaprender.

Nadie tiene un estilo perfecto, por eso es un "estilo", lineamientos estéticos, ordenados y algunos estándares que nosotros ( y en ocasiones un equipo ) seguimos. De alguna manera es importante aprender la parte del Perl "Idiomático" es decir, un Perl donde sientas que realmente es Perl utilizando bien lo que el lenguaje te provee.

Incluso Guy L. Steele en el fareword de un libro (Effective Java Programming Language) menciona las 3 fase que un programador sigue para aprender algo, y son generalmente: aprender la sintaxis, luego estilo y luego conceptos avanzados e internals.

Y el estilo nunca lo terminas de aprender. Y tampoco intento cambiar tu estilo, si así estás acostumbrado adelante. Eso es mas tolerable que:
Código: Seleccionar todo
my $foo = $_[0];


Saludos,
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924

Re: Usar parametros por referencia desde una funcion

Notapor explorer » 2006-01-17 15:56 @706

Ok.
Pues sólo decir que gracias a estos comentarios todos aprendemos un motón... y en cuanto al estilo no me importa cambiar.
Leo mis códigos de hace 5 años y me tiro de los pelos por lo mal que lo hacía, simplemente por ser ilegibles. Y a partir de ahí, se va viendo que intentas escribir código lo más claro posible, copiando a veces código que has visto en otros lugares y que te parece claro y limpio.
Para mi lo más difícil todavía es cuando el código empieza a tener varios centenares de líneas... en ese momento hecho de menos herramientas de desarrollo potentes, como el Komodo...
Bueno... eso es otra historia...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor d2bit » 2006-01-18 02:13 @134

Bueno, decir que muchas gracias por contestar y tan rápido... :)

EL problema lo tenia llamando a la función que usaba el '&'.

Saludos.
Avatar de Usuario
d2bit
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2006-01-13 07:12 @341


Volver a Intermedio

¿Quién está conectado?

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

cron