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
 
