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
