无法在perl中打印散列哈希或访问元素的大小

时间:2013-04-23 18:29:09

标签: perl

我有一个哈希%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

任何人都知道我的问题是什么原因?

4 个答案:

答案 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来打印