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 ->
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->[1,2] ARRAY(0x810479c) DB<9> p $rm->[1]->[1] 1¿Puede explicar la conducta observada en
p $rm->[1,2]
? La razón es que el
operador de flecha no funciona con trozos y 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);