2011-08-05 48 views
1

使用此报告syntax error关于哈希引用在Perl

$hash={a=>2}; 
print %{$hash}{a}; 

但这个工程:

print each(%{$hash}) 

为什么?

+0

不是问题的直接答案,而是'print $ hash - > {a};'起作用。 –

回答

5

要从hashref获取元素,你走正常的代码得到一个哈希元素:$foo{'bar'},并更换名称的哈希的,不包括印记,与hashref:$$hash{'bar'}。您的%只能用于取消引用完整散列,因为在每种情况下,不仅仅是一个元素。

更多帮助提示http://perlmonks.org/?node=References+quick+reference

3

也许这将帮助你理解为什么这是错的......

$hash = {a => 2};  #Works: $hash is a reference to the hash 
%foo = %{$hash};  #Now, we've dereferenced the hash to %foo 

# Wherever we have "$hash", we can now use "foo"... 

print %foo{a};  #Whoops! Doesn't work. 
print %hash{a};  #And, neither did this! 

print $foo{a};  #No problem! Use '$" when talking about a single hash element 
print ${$hash}{a}  #Same as above. 

print each %foo;  #Each takes a hash (with "%" sign) 
print each %{$hash}; #Same as above. 

print $hash->{a}  #Syntactic Sugar: Same as ${$hash{a}} or $$hash{a} 
1

呀,就像print %hash{a}不即使each(%hash)做工作。

each(%hash)  ==> each(%{ $ref }) 
print($hash{a}) ==> print(${ $ref }{a}) 
0

您错过了查找' - >'。

print %{$hash}{a}; 

应该是:

print %{$hash}->{a}; 

你声明为$但随后尝试转换为哈希和检索的价值,不知道为什么。

只是检索像这样:

print $hash->{a}; 

我个人的偏好,当谈到散列:

$hash1->{a} = 1; 
print $hash1->{a}, "\n"; # prints '1' 

多级:

$hash2->{a}{a} = 1; 
$hash2->{a}{b} = 2; 
print $hash2->{a}{a}, "\n"; # prints '1' 
print $hash2->{a}{b}, "\n"; # prints '2' 

循环:

while (my ($key, $value) = each %{$hash1}) 
{ 
    print $key, "\n"; # prints 'a' 
    print $value, "\n"; # prints '1' 
} 
+0

'print%{$ hash} - > {a};'实际上并不是有效的,尽管它发生了很长时间的事故。在最近的perls上,它会给出警告“使用散列作为参考已被弃用” – ysth