Mar Ene 17, 2006 10:19 am
|
 |
d2bit
Perlero Nuevo

|
Registrado: 13 Ene 2006
Mensajes: 3
|
|
| Usar parametros por referencia desde una funcion |
|
|
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 |
|
|
|

Mar Ene 17, 2006 11:08 am
|
 |
Perl user
Maestro Honorario

|
Registrado: 03 Nov 2004
Mensajes: 385
|
|
|
|
|
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: |
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, |
|

Mar Ene 17, 2006 11:19 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4123
Ubicación: Valladolid, España
|
|
|
|
|
| Código: |
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";
} |
Ultima edición por explorer el Mar Ene 17, 2006 12:02 pm, editado 1 vez |
|

Mar Ene 17, 2006 11:30 am
|
 |
Perl user
Maestro Honorario

|
Registrado: 03 Nov 2004
Mensajes: 385
|
|
|
|
|
| explorer escribió: |
| Código: |
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: |
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, |
|

Mar Ene 17, 2006 12:29 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4123
Ubicación: Valladolid, España
|
|
|
|
|
| Perl user escribió: | | 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
o
| Código: |
| 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 ) |
|

Mar Ene 17, 2006 12:45 pm
|
 |
Perl user
Maestro Honorario

|
Registrado: 03 Nov 2004
Mensajes: 385
|
|
|
|
|
| explorer escribió: | 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: |
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 escribió: |
Otra cosa es el estilo. Según las últimas prácticas de Damian Comway, lo correcto sería hacer un
o
| Código: |
| 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, |
|

Mar Ene 17, 2006 2:14 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4123
Ubicación: Valladolid, España
|
|
|
|
|
| Perl user escribió: | 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 escribió: |
| explorer escribió: | | 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...
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... |
|

Mar Ene 17, 2006 2:28 pm
|
 |
Perl user
Maestro Honorario

|
Registrado: 03 Nov 2004
Mensajes: 385
|
|
|
|
|
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:
Saludos, |
|

Mar Ene 17, 2006 2:56 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4123
Ubicación: Valladolid, España
|
|
|
|
|
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... |
|
Mie Ene 18, 2006 1:13 am
|
 |
d2bit
Perlero Nuevo

|
Registrado: 13 Ene 2006
Mensajes: 3
|
|
|
|
|
Bueno, decir que muchas gracias por contestar y tan rápido...
EL problema lo tenia llamando a la función que usaba el '&'.
Saludos. |
|
Powered by phpBB © 2001, 2005 phpBB Group
|