有人可以帮我解决下面的代码。
sub test
{
%hs=@_;
print %hs;
print "\n";
print $hs{'c'}."\n";
print $hs{'d'}."\n";
# print "\n";
print $hs{'e'}{'game'}; # Not getting the output for this step. it should be 12 ?
print "\n";
#print ${$hs{'e'}}{'dv'};
foreach $key (sort keys %hs)
{
print $key."\n";
}
}
%hash=('game'=>'12','gh'=>'31');
print $hash{'game'}."\n";
test(c=>'123',d=>'345',e=>"%hash");
12
e%hashc123d345
123
345
c
d
e
Press any key to continue . . .
print $hs{'e'}{'game'}
给我null。请告诉我如何访问哈希的哈希。
此致 Sujeet
答案 0 :(得分:4)
您应该在所有Perl程序中始终 use strict
和use warnings
。启用它们会显示此错误(在使用my
声明变量之后)。
不能使用字符串("%hash")作为HASH参考,而#34; strict refs"在使用中
有问题的一行正是您所想的那条。
print $hs{'e'}{'game'};
但现在很容易发现。
test( c => '123', d => '345', e => "%hash" );
您正试图以某种方式插入变量%hash
。或许您只是想到了如何制作更具维度的数据结构。
要将哈希放入哈希,您需要在Perl中使用引用。您可以使用%hash
引用运算符为\
创建引用。
test( c => '123', d => '345', e => \%hash );
试试吧。我删除了与之无关的代码。
sub test {
my %hs = @_;
print $hs{'e'}{'game'};
}
my %hash = ( 'game' => '12', 'gh' => '31' );
test( c => '123', d => '345', e => \%hash );
现在您的输出是:
12
要了解有关Perl中引用的更多信息,请查看[perlref] [2]和[perlreftut] [3]。您还可以在Perlmaven上查看这些教程:
这也是我更喜欢一直使用->
解除引用运算符的原因之一,因此$hs{e}{game}
变为$hs{e}->{game}
,尽管没有必要这样做。 Perl会知道你的意思。但是对于->
,更明显的是有一个参考。
功能
另请注意,哈希不会进行插值,因此"%hash"
不会像$,
那样使用"@array"
进行展开。这可能是因为哈希没有排序。或者因为你不能做printf "%s\n"
。
功能