Molte persone hanno al pronto a dare le risposte corrette qui. Volevo aggiungere un esempio che ho trovato illuminante. È possibile leggere la documentazione in perldoc perlref per ulteriori informazioni.
Il tuo problema è uno di ambiguità, si hanno due operazioni $$
e [0]
che lavorano sullo stesso identificatore _
, e il risultato dipende da quale operazione viene eseguita per prima. Possiamo renderlo meno ambiguo utilizzando le parentesi graffe di supporto ${ ... }
. $$_[0]
potrebbe (per un essere umano comunque) significare:
${$$_}[0]
- dereference scalare $_
, poi prendere il primo elemento.
${$_[0]}
- prendere l'elemento 0
dell'array @_
e dereferenziarlo.
Come si può vedere, questi due casi si riferiscono a completamente diverse variabili, @_
e $_
.
Ovviamente, per Perl non è ambiguo, semplicemente otteniamo la prima opzione, poiché il dereferenziamento viene eseguito prima della ricerca della chiave. Abbiamo bisogno delle parentesi graffe di supporto per ignorare questo dereferenziamento, ed è per questo che il tuo esempio non "funziona" senza parentesi di supporto.
Si potrebbe considerare una funzionalità leggermente meno confusa per la subroutine. Invece di cercare di fare due cose contemporaneamente (ottenere l'argomento e dereferenziarlo), lo si può fare in due fasi:
sub foo {
my $n = shift;
print $$n;
}
Qui, prendiamo il primo argomento off @_
con shift
, e poi dereferenziarlo. Pulito e semplice
Molto spesso, non si useranno i riferimenti alle variabili scalari, tuttavia. E in quei casi, è possibile utilizzare l'operatore freccia ->
my @array = (1,2,3);
foo(\@array);
sub foo {
my $aref = shift;
print $aref->[0];
}
Trovo usando l'operatore freccia preferibile alla sintassi $$
.