DB<1> $ra = \('a', 'b', 'c') DB<2> p $ra SCALAR(0x81095a8) DB<3> p $$ra c¿Que está pasando? ¿Porqué
$ra
no es una referencia a un array sino a un escalar?
Observe que la parte izquierda de la asignación es $ra
, lo cual establece un
contexto escalar.
Compare el resultado anterior con este otro:
DB<1> $a = 4; $b = 5; $c = 6 DB<2> @a = \($a, $b, $c) DB<3> p @a SCALAR(0x81046d0)SCALAR(0x81046f4)SCALAR(0x81046ac) DB<4> p \$a, \$b, \$c SCALAR(0x81046d0)SCALAR(0x81046f4)SCALAR(0x81046ac)en un contexto de lista el operador
\
actúa sobre cada uno
de los elementos de la lista.
En el siguiente ejemplo observamos la acción del operador \
en una posible situación ambigua:
DB<1> @a = (\(1, 0, 0), \(0, 1, 0), \(0, 0, 1)) DB<2> p @{$a[1]} Not an ARRAY reference at (eval 17)[/usr/share/perl/5.6.1/perl5db.pl:1521] line 2.No se trata por tanto que produzca referencias a cada uno de los vectores. En realidad
@a
contiene un vector de referencias a los elementos individuales:
DB<3> x @a 0 SCALAR(0x8450d74) -> 1 1 SCALAR(0x81046f4) -> 0 2 SCALAR(0x8450dc8) -> 0 3 SCALAR(0x8461ccc) -> 0 4 SCALAR(0x846cd28) -> 1 5 SCALAR(0x8461c9c) -> 0 6 SCALAR(0x8461a68) -> 0 7 SCALAR(0x84619d8) -> 0 8 SCALAR(0x84619cc) -> 1Las subexpresiones como estas no se evalúan en un contexto escalar y se consideran sublistas y por tanto se aplanan. Vea el ejemplo:
DB<1> @a = ((1, 0, 0), (0, 1, 0), (0, 0, 1)) DB<2> x @a 0 1 1 0 2 0 3 0 4 1 5 0 6 0 7 0 8 1 DB<3> @a = (scalar(1, 0, 0), scalar(0, 1, 0), scalar(0, 0, 1)) DB<4> x @a 0 0 1 0 2 1