变量看起来不像散列的foreach中定义的那样

时间:2011-10-05 18:50:51

标签: perl foreach

my $crazy_hash = {

  'One' => 1,

  'Two' => 1,

  'Three' => 1,

};


 foreach my $num (keys %crazy_hash) {
      #DoSomething    
  }

我得到的错误是:

全局符号“%crazy_hash”需要在blah line blah

显式包名

如果我执行我的%crazy_hash并在循环中定义它,它就可以了。为什么它不能正常工作?

2 个答案:

答案 0 :(得分:4)

您尚未定义名为%crazy_hash的哈希,您已定义了一个标量$crazy_hash,其中包含对哈希的引用。

你可能是这个意思:

my %crazy_hash = ( One => 1, ...

...或者像其他人所建议的那样使用keys %{$crazy_hash}访问密钥;然后,您需要使用$crazy_hash->{key}而不是$crazy_hash{key}来访问值。如果您需要了解参考文献,请阅读perlreftut。

答案 1 :(得分:3)

$crazy_hash是对匿名哈希的引用。在5.14之前,您需要取消引用keys的引用:

for my $num (keys %{$crazy_hash}) {

从5.14开始:

  

从Perl 5.14开始,键可以采用标量EXPR,它必须包含对未经处理的散列或数组的引用。该参数将自动解除引用。钥匙的这个方面被认为是高度实验性的。在未来的Perl版本中,确切的行为可能会发生变化。