2012-10-01 16 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'} }