next up previous contents index practicapracticaPP2moodleLHPmoodlepserratacpanmodulospauseperlgoogleetsiiullpcgull
Sig: Precedencias y prefijos Sup: Referencias a variables ya Ant: Referencias a constantes Err: Si hallas una errata ...

Contextos y referencias

Un aviso sobre los peligros de Perl. Observe la siguiente ejecución con el depurador:
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) -> 1
Las 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


next up previous contents index practicapracticaPP2moodleLHPmoodlepserratacpanmodulospauseperlgoogleetsiiullpcgull
Sig: Precedencias y prefijos Sup: Referencias a variables ya Ant: Referencias a constantes Err: Si hallas una errata ...
Casiano Rodríguez León
2006-02-21