hash
o array
a través de una referencia
puede resultar incómodo, por eso Perl provee una sintáxis adicional:
$arr_ref = \@a; $hsh_ref = \%h; $sub_ref = \&s; $a[0] = $hsh_ref->{"first"} # $a[0] = $h{"first"} # o bien ... $arr_ref->[0] = $h{"first"} # $a[0] = $h{"first"}
El operador flecha ->
toma una referencia a su izquierda y un ındice o clave a su derecha, localiza el
array
o hash
correspondiente y accede al elemento apropiado.
Analize el siguiente ejemplo:
DB<1> @a = (1, 0, 0); @b = (0, 1, 0); @c = (0, 0, 1) DB<2> @m = \(@a, @b, @c) DB<3> p @m ARRAY(0x810461c)ARRAY(0x8104790)ARRAY(0x810479c) DB<4> $rm = \@m DB<5> p $rm->[2] ARRAY(0x810479c) DB<6> p @$rm->[2] # Lo mismo que: p @{$rm}->[2] ARRAY(0x810479c) DB<7> p @{$rm->[2]} 001 DB<8> p "@{$rm->[2]}" 0 0 1 DB<9> p $rm->[1,2] ARRAY(0x810479c) DB<10> p $rm->[1]->[1] 1 DB<11> p $rm->[1][1] # La segunda flecha puede omitirse 1¿Puede explicar la conducta observada en la línea 9 (
p $rm->[1,2]
)?
La razón es que el
operador de flecha fuerza un contexto escalar en la evaluación del
ındice. La subexpresión 1,2
es evaluada
en un contexto escalar.
El operador flecha puede aplicarse a referencias a subrutinas, de manera que en vez de escribir:
&{$sub_ref}($arg1, $arg2, $etc);
podamos escribir:
$sub_ref->($arg1, $arg2, $etc);
Casiano Rodríguez León