20070813

usando referencias en Perl

Hoy en el trabajo tuve que hacer un código simple para mostrar el uso de referencias en Perl, en vez de pasar parámetros y recibirlos luego de llamar a la función.

El código es:


#!/usr/bin/perl -w

use strict;

sub myfun {
my $k = \shift;
${$k} = "Chau Mundo";
print "k es '" . ${ $k } . "'\n";
print "k es '" . $$k . "'\n";
return $$k ;
}

my $p = "Hola Mundo";
print myfun($p) . "\n";;
print "p es $p\n";


La salida de este programa es:

matias@t0001850023:/tmp$ perl -w k.pl
k es 'Chau Mundo'
k es 'Chau Mundo'
Chau Mundo
p es Chau Mundo


Una de las razones para necesitar usar referencias en vez de variables, es que el paso de variables simples copia la variable de un lado a otro, pero si uno tiene problemas de memoria, o tiene algunas variables muy pesadas (megas), puede ser necesario usar referencias para economizar recursos.

La explicación es bastante simple, al usar la "\" delante del shift (el shift regresa el primer valor del array -en este caso @_- y lo borra del array), en realidad no se hace la asignación del valor, sino de la dirección (puntero). Luego, para usar el valor del scalar, hay que llamarlo con un "$" extra. Al hacer una asignación, se hace la asignación a donde apunta el puntero, y no al puntero en sí (si se pierde todo si se hace un "$k = 0;", abortaría por intentar modificar un valor de solo lectura).

Esta es una referencia con ruby, dado que todo es una referencia, y hacer una asignación de valores es lo que es "no convencional".

3 comentarios:

Anónimo dijo...

Gracias! Me has aclarado el uso de referencias

nnss dijo...

De nada, si quieres, puedes subscribirte a la lista (poco tráfico), hay varios que saben de Perl y el tiepo de respuesta es bastante bajo (pese a que no hay mucho tráfico, se responde rápido).

Anónimo dijo...

Estamos hablando de los pointers en C ? es eso a lo que en Perl se les llama referencias ?