2012-10-01 10 views
6

Perlの用語は私を混乱させ、それは私の母国語ではないので、私に同行してください。適切な用語を使用しようとしますが、確かめるために例を挙げます。なぜperlはハッシュリファレンスのメンバーを配列に逆参照できないのですか?

私は変数$ fooにハッシュリファレンスを持っています。 $ foo - > {'bar'} - > {'baz'}は配列参照です。つまり、$ foo - > {'bar'} - > {'baz'} - > [0]をスカラに代入することで配列の最初のメンバーを得ることができます。

私はこれを行うとき:

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

を私はエラー "未script.plライン41のARRAYのリファレンス"

を取得しかし、私はこれを行うとき、それは動作します:

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

私には理解できないことがありますか?最初の例がうまくいく方法がありますか?私は括弧の中に@を外側に置いてみましたが、うまくいきませんでした。ヘルプのお時間をありがとうございます。

+0

パーサーは、あなたが意味することを理解している必要があります。最初に試した構文は、@ $ fooを逆参照したいものです。それは、どのように異なったトークンがそれらの周りのものに結びつくかについてです。私たちは_Intermediate Perl_についてもっと長い説明をしています。 :) –

答えて

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

のようになります、それはなります - それはちょうど優先順位の問題だ

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

この問題を抱える他の人にとって、この答えの鍵は、表現全体を囲む中括弧です。優先順位の問題についての説明も非常に役立つので、私は2つの答えをマークすることができたらいいと思う。 –

+4

@JasonThompsonそれでは、解説に正しい答えを記入してみませんか? – TLP

+0

なぜ受け入れられた回答の下投票? downvoterはここにコメントを残すことができますか? –

3

あなたはそのRHSでループのためのあなた$myarrを交換した場合のようにそれは

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

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

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

$fooが配列参照、従ってエラーを含まないことを意味します。参照式の回りにオプションの小括弧を省略しないと、優先順位の問題は発生しません。

@{ $foo->{'bar'}->{'baz'} } 
関連する問題