2012-10-01 17 views
6

Perl術語讓我困惑,它不是我的母語,所以請耐心等待。我會嘗試使用正確的術語,但我會舉一個例子來確保。爲什麼perl不允許我將哈希引用的成員解引用到數組中?

所以我在變量$ foo中有一個哈希引用。可以說$ foo - > {'bar'} - > {'baz'}是一個數組引用。這是我可以通過將$ foo - > {'bar'} - > {'baz'} - > [0]賦給標量來獲得數組的第一個成員。

當我這樣做:

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

我得到的錯誤 「一點也不script.pl線數組引用41」

但我做到這一點時,它的工作原理:

$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 $_ 
} 

如果更換您的$myarr與它的RHS循環,它看起來像: -

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

對於任何絆倒這一點的人來說,這個答案的關鍵是包裹整個表情的花括號。我希望我能標出兩個答案,因爲對優先問題的解釋也是非常有幫助的。 –

+4

@JasonThompson那你爲什麼不把答案標上正確的解釋? – TLP

+0

爲什麼對接受的答案進行反對? downvoter可以在這裏留言嗎? –

3

它應該看起來像

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

這只是一個優先問題。

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

裝置

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

$foo不包含數組引用,從而該錯誤。如果不忽略參考表達式的可選曲線,則不會獲得優先級問題。

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