2012-10-01 8 views
6

Perl Begriffe verwechseln mich und es ist nicht meine Muttersprache, also ertragen Sie mit mir. Ich werde versuchen, die richtigen Begriffe zu verwenden, aber ich werde ein Beispiel geben, nur um sicherzugehen.Warum erlaubt Perl mir nicht, ein Mitglied einer Hash-Referenz in ein Array zu dereferenzieren?

Also habe ich einen Hash-Verweis in der Variablen $ foo. Nehmen wir an, dass $ foo -> {'bar'} -> {'baz'} eine Array-Referenz ist. Das heißt, ich kann das erste Mitglied des Arrays erhalten, indem ich einem Skalar $ foo -> {'bar'} -> {'baz'} -> [0] zuweise.

, wenn ich dies tun:

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

Ich erhalte die Fehlermeldung "kein Array Bezug auf script.pl Linie 41"

Aber wenn ich dies tun, funktioniert es:

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

Gibt es etwas, das ich nicht verstehe? Gibt es eine Möglichkeit, das erste Beispiel zum Laufen zu bringen? Ich habe versucht, den Ausdruck in Klammern mit dem @ auf der Außenseite zu wickeln, aber das hat nicht funktioniert. Vielen Dank für die Hilfe.

+0

Der Parser muss verstehen, was Sie meinen, und die Syntax, die Sie auf Anhieb Dinge versuchen Sie zu dereferenzieren @ $ foo, die Sie nicht in Ihrem Fall. Es geht darum, wie verschiedene Token an die Dinge um sie herum binden. Wir haben eine längere Erklärung in _Intermediate Perl_. :) –

Antwort

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

Wenn Sie Ihre $myarr in for-Schleife mit RHS ersetzen, sieht es so aus: -

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

Für alle anderen, die darauf stolpern, ist der Schlüssel zu dieser Antwort die geschweiften Klammern, die den gesamten Ausdruck umschließen. Ich wünschte, ich könnte zwei Antworten markieren, weil die Erläuterung der Präzedenzfrage ebenfalls sehr hilfreich ist. –

+4

@JasonThompson Warum markieren Sie dann die Antwort mit der Erklärung nicht als die richtige? – TLP

+0

Warum eine Down-Abstimmung über eine akzeptierte Antwort? Kann der Downvoter hier einen Kommentar hinterlassen? –

3

Es aussehen sollte

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

Es ist nur ein Vorrang Problem.

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

bedeutet

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

$foo kein Array Referenz enthält, wodurch der Fehler. Das Präzedenzproblem tritt nicht auf, wenn Sie die optionalen Curlies um den Referenzausdruck nicht auslassen.

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