Ambiguedad en el De-referenciado

¿Como se debe interpretar la expresión $$a[1]? ¿Cómo ${$a[1]} o bien como ${$a}[1]? ¿Se está hablando de un array @a cuyo elemento $a[1] es una referencia a un escalar o es $a una referencia a una lista @$a cuyo segundo elemento esta siendo accedido?

La siguiente ejecución en el depurador nos muestra la respuesta:

  DB<1> $a = 4; $b = 5; $c = 6
  DB<2> @a = \($a, $b, $c)
  DB<3> $a = \@a
  DB<4> p $$a[1]
SCALAR(0x81046f4)
  DB<5> p @a
SCALAR(0x81046d0)SCALAR(0x81046f4)SCALAR(0x81046ac)
  DB<6> p ${$a[1]}
5
  DB<7> p ${$a}[1]                      # $$a[1] es ${$a}[1]
SCALAR(0x81046f4)

Regla de Evaluación de los Prefijos

Cuando Perl evalúa una expresión deja la evaluación de los índices y las claves para el final. El prefijo mas cercáno a la variable es el primero en evaluarse. Es decir, los prefijos se evalúan de derecha a izquierda.

El Significado de las LLaves

Las llaves significan un bloque de código. Así pues en la expresión ${ ... }[1] la parte interna a las llaves es un bloque de código que debe, eso si, devolver una referencia a un array. Veamos un ejemplo:

sub t {
  return \$a;
}

$a = 10;
$b = ${t()};
print $b; # 10



Subsecciones
Casiano Rodríguez León
2009-10-04