Lo normal es que una expresión como $$a
indique
que $a
es una variable del tipo referencia a un escalar.
Si no fuera el caso, esto es, si $a
no fuera
una referencia, Perl comprueba si $a
contiene
una cadena (esto es, la variable
está en un contexto escalar cadena) y si es el caso usa esa cadena
como nombre de una variable de paquete. Esto se conoce como
referenciado simbolico. Su uso es mas eficiente que la alternativa
de usar eval
. Veamos un ejemplo (obsérvese la ausencia de -w
y
de use strict
):
lhp@nereida:~/Lperl/src/testing$ cat -n symbolicref.pl 1 #!/usr/bin/perl 2 sub data { 3 my ($fa, $sa) = @_; 4 print "Inside data\n"; 5 print "First list: @$fa\n"; 6 print "Second list: @$sa\n"; 7 } 8 9 $data = 4; 10 @data = (1,2,3,4); 11 @tutu = 5..8; 12 $name = "data"; 13 14 print "${$name}\n"; 15 push @{$name}, @data; 16 print "@data\n"; 17 &{$name}('data', 'tutu');La ejecución da como resultado:
lhp@nereida:~/Lperl/src/testing$ symbolicref.pl 4 1 2 3 4 1 2 3 4 Inside data First list: 1 2 3 4 1 2 3 4 Second list: 5 6 7 8