变量“需要显式包”名称问题

时间:2014-01-11 17:28:38

标签: perl

my %order;
while ( my $rec = $data->fetchrow_hashref ) {
    push @{ $result{ $rec->{"ID"} } }, $rec->{"item"};
    push @order, $rec->{ID};
}

我得到全球符号" @ order"需要在行push @order, $rec->{ID};

处显式包名称

2 个答案:

答案 0 :(得分:5)

Perl的标识识别不同的数据类型。如果两个相同的标识符具有不同的符号,则它们完全是不同的变量。

my $var; # This is a scalar.
my @var; # This is an array.
my %var; # This is a hash.

这三者中的每一个都是完全不同的变量。

您收到的错误消息是因为在您发布的代码中,您声明了一个名为%order的哈希,而在您发布的代码的第四行,您将推送到名为{{1}的数组}。该数组从未被声明过。如果没有明确的声明,Perl将首次假设它看到一个变量,它打算成为一个全局包。因为您正在使用@orderstrict 'vars'(其中strict是隐式的),Perl不允许您首先自动生成包全局或任何其他类型的变量除非你完全符合其名称,否则宣布它。

perldoc strict中解释了此行为,其中声明:

  

如果访问的是变量,则会生成编译时错误   既没有明确声明(使用我的,我们的,州或任何使用vars   )也不完全合格。

由于代码中的明确意图是将vars值添加到数组中,因此最简单的修复可能是将第一行从push更改为my %order;,以便您'重新声明一个数组而不是一个哈希。

目前还不清楚,如果没有看到更多代码,就知道如何处理通过引用推送数组的行。据推测,您已经知道该部分代码是正确的。

答案 1 :(得分:3)

您声明了哈希 %order,但尝试使用数组 @order