mercoledì 19 febbraio 2014

Eliminare la freccia in Perl

Perl utilizza l'operatore '->' (freccia) per la dereferenziazione esplicita dei riferimenti.
Spesso accade che i neofiti di Perl restino confusi da quando l'operatore '->' puo' essere rimosso dalle espressioni. Si consideri il seguente esempio:

my $array_ref = [ [ qw(a b c)], [qw(1 2 3)] ];

say "The first cells are " . $array_ref->[0]->[0] . " and " . $array_ref->[1][0];

Non vi e' alcuna ragione per usare la doppia freccia, come riportato  nell'ultimo accesso al primo elemento del secondo array.
Ma perche'?
In Perl non e' possibile definire array di array, o piu' in generale, strutture dati complesse senza passare attraverso i riferimenti. Ne consegue che dopo la prima '->', che dereferenzia un riferimento, se ci si trova una espressione di indicizzazione Perl sa che deve trattarla come una ulteriore dereferenziazione.
Quando Perl trova $array_ref->[1] sa che deve trattarla come una dereferenziazione (operatore '->') seguita dall'accesso ad un array; se le cose si fermano qui tutto bene, ma se si aggiunge un altro accesso ad array (o hash) Perl sa per certo che questo e' possibile solo tramite riferimento, e quindi la dereferenziazione e' implicita.

Nessun commento: