Capire i riferimenti è un elemento fondamentale per usare Perl in modo efficace. Dato che i riferimenti sono scalari, e gli array e gli hash possono contenere solo scalari, i riferimenti sono essenziali per annidare queste strutture dati.
I riferimenti si possono creare per variabili e subroutine esistenti usando l'operatore barra rovesciata \:
\$scalar per creare un riferimento a uno scalare (può essere qualsiasi scalare, ad esempio \1, non solo una variabile).\@array per creare un riferimento a un array.\%hash per creare un riferimento a un hash.\&sub per creare un riferimento a codice.Puoi anche creare quello che viene chiamato riferimento anonimo per array, hash e subroutine:
['Alice', 'Bob', 'Charlie'] per creare un riferimento anonimo a un array.{foo => 'a', bar => 'b', baz => 'c'} per creare un riferimento anonimo a un hash.sub { return 1 } per creare un riferimento anonimo a codice.ATTENZIONE: le parentesi graffe in Perl possono essere ambigue in certi contesti. Se non ottieni il riferimento a un hash che ti aspetti, aggiungi un più all'inizio per disambiguare, ad esempio +{}. Per maggiori informazioni, vedi Parentesi graffe.
Ai riferimenti si può accedere usando l'operatore freccia ->:
$ref->[0] per accedere a un elemento all'interno di un riferimento a un array.$ref->{foo} per accedere a un valore all'interno di un riferimento a un hash.$ref->($arg) per chiamare una subroutine tramite un riferimento a codice.Ai dati all'interno di strutture dati complicate, come array multidimensionali e hash annidati, si può accedere concatenando gli indici, ad esempio $ref->{foo}[0]{bar} (equivalente a $ref->{foo}->[0]->{bar}).
Se vuoi dereferenziare un intero array o hash, puoi usare l'operatore freccia seguito rispettivamente da @* o %*, ad esempio $ref->@* oppure $ref->%*.
Puoi anche ottenere degli slice da un riferimento a un array o a un hash sostituendo il * con un indice, ad esempio $ref->@[0..2] oppure $ref->@{'Foo', 'Bar'}.
Per gli slice, la variazione del sigil funziona qui allo stesso modo che con le variabili array e hash.