我有一个哈希%AllData使用以下代码从数据库中提取数据:
while(my $Row = $sth1->fetchrow_hashref())
{
if(defined($Row->{LotID}))
{
$AllData->{$Row->{LotID}}->{$Row->{Name}} = $Row->{Details};
}
}
完成数据提取后,我使用print Dumper($AllData);
打印出我所有的数据,如:
$VAR1 = {
'4197359' => {
'Short Description' => 'Rock Picker',
'Lot Number' => '1065',
'Description' => 'Rock Picker'
},
'4194148' => {
'Short Description' => 'Large work bench w/ drawers',
'Lot Number' => '1041',
'Description' => 'Large work bench w/ drawers'
},
'4200944' => {
'Lot Number' => '1084',
'Description' => 'Horse Trailer'
}
}
但是,当我尝试打印出散列的大小或使用foreach来访问散列时,它显示0大小并且无法访问散列中的任何元素:
print "Hash Size: ", scalar keys %AllData, "\n";
所示:
哈希大小:0
任何人都知道我的问题是什么原因?
答案 0 :(得分:6)
没有哈希%AllData
,如果您的程序没有引发错误,那么您还没有
use strict;
use warnings;
在你的计划负责人。这对于所有 Perl程序来说都是至关重要的,特别是当您要求其他人帮助您编写代码时。
您感兴趣的哈希值是$AllData
引用的哈希值,因此您需要使用此变量并取消引用它。喜欢这个
print "Hash Size: ", scalar keys %$AllData, "\n";
答案 1 :(得分:4)
尝试访问scalar keys %$AllData
以访问引用..所引用的哈希值。
$AllData
(您传递给Dumper()
的内容)是散列的引用('hashref')
%AllData
与Perl不同之处在于$AllData
。如果尚未设置并且perl没有抱怨,您可能需要尝试将use strict;
放在脚本的顶部,以便可以警告您这些(和其他)类型的错误。
答案 2 :(得分:2)
也许你需要先取消引用哈希:
print "Hash Size: ", scalar keys %{ $AllData }, "\n";
答案 3 :(得分:0)
应将哈希引用表示为$%hash
而不是%hash
来打印