2012-10-01 21 views
6

Perl termini mi confondono e non è la mia lingua madre, quindi abbi pazienza con me. Proverò ad usare i termini giusti, ma darò un esempio solo per essere sicuro.Perché perl non mi consente di dereferenziare un membro di un riferimento hash in un array?

Quindi ho un riferimento hash nella variabile $ pippo. Diciamo che $ pippo -> {'bar'} -> {'baz'} è un riferimento di matrice. Cioè posso ottenere il primo membro dell'array assegnando $ pippo -> {'bar'} -> {'baz'} -> [0] a uno scalare.

quando faccio questo:

foreach (@$foo->{'bar'}->{'baz'}) 
{ 
    #some code that deals with $_ 
} 

ottengo l'errore "Non è un riferimento ad array in linea script.pl 41"

Ma quando faccio questo funziona:

$myarr = $foo->{'bar'}->{'baz'}; 
foreach (@$myarr) 
{ 
    #some code that deals with $_ 
} 

C'è qualcosa che non capisco? C'è un modo per far funzionare il primo esempio? Ho provato a racchiudere l'espressione tra parentesi con @ all'esterno, ma non ha funzionato. Grazie in anticipo per l'aiuto.

+0

Il parser deve capire cosa intendi, e la sintassi che provi al primo tentativo di dereferenziare @ $ pippo, che non puoi nel tuo caso. Si tratta di come diversi token si legano alle cose che li circondano. Abbiamo una spiegazione più lunga in _Intermediate Perl_. :) –

risposta

11
$myarr = $foo->{'bar'}->{'baz'}; 
foreach (@$myarr) 
{ 
    #some code that deals with $_ 
} 

Se si sostituisce il $myarr nel ciclo for con il suo RHS, sembra che: -

foreach (@{$foo->{'bar'}->{'baz'}}) 
{ 
    #some code that deals with $_ 
} 
+0

Per chiunque altro si imbatta in questo, la chiave di questa risposta è le parentesi graffe che racchiudono l'intera espressione. Vorrei poter contrassegnare due risposte perché anche la spiegazione sul problema della precedenza è molto utile. –

+4

@JasonThompson Allora perché non contrassegni la risposta con la spiegazione corretta? – TLP

+0

Perché un voto negativo su una risposta accettata ?? Il downvoter può lasciare un commento qui ?? –

3

dovrebbe assomigliare

foreach (@{$foo->{'bar'}->{'baz'}}) 
{ 
    #some code that deals with $_ 
} 
14

E 'solo una questione di precedenza.

@$foo->{'bar'}->{'baz'} 

significa

((@{ $foo })->{'bar'})->{'baz'} 

$foo non contiene un riferimento ad array, così l'errore. Non si ottiene il problema di precedenza se non si omettono i riccioli facoltativi attorno all'espressione di riferimento.

@{ $foo->{'bar'}->{'baz'} } 
Problemi correlati