1

我有一个%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";

显示:

Hash Size: 0

我的问题的原因是什么?

4

4 回答 4

6

没有 hash %AllData,如果你的程序没有引发错误,那么你就没有

use strict;
use warnings;

在你的程序的头部。这对于所有Perl 程序都至关重要,尤其是在您向他人寻求代码帮助时。

您感兴趣的哈希是由 引用的哈希$AllData,因此您需要使用此变量并取消引用它。像这样

print "Hash Size: ", scalar keys %$AllData, "\n";
于 2013-04-23T18:39:27.887 回答
4

尝试访问scalar keys %$AllData以访问引用.. 所指的哈希。

  • $AllData(您传递给的内容Dumper())是对哈希的引用('hashref')

  • %AllData与 Perl 不同的是$AllData. 如果这还没有设置并且 perl 没有抱怨,您可能需要尝试use strict;在脚本的顶部放置,以便可以警告您这些(和其他)类型的错误。

于 2013-04-23T18:40:27.630 回答
2

也许您需要先取消引用哈希:

print "Hash Size: ", scalar keys %{ $AllData }, "\n";
于 2013-04-23T18:34:50.607 回答
0

应该表示一个哈希引用$%hash而不是%hash打印

于 2013-07-01T07:44:43.460 回答