La Notación Flecha

El acceso a los elementos de un 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
Licencia de Creative Commons
Principios de Programación Imperativa, Funcional y Orientada a Objetos Una Introducción en Perl/Una Introducción a Perl
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=43.
2012-06-19