Perl - 全局符号需要显式包名称

时间:2016-08-19 02:03:53

标签: perl

我正在调用perl子例程

&ProcessInput($line, \%txcountershash, \%txhash);

我有这个定义:

sub ProcessInput() {    
my $word;
my $counterkey;   
my $line = $_[0];
my $countershash = $_[1];
my $outputhash = $_[2];  

# remove all the blanks from the line
$line =~ s/\s+//g;  

my ($port,$counter,$value,$datetime) = split('\|',$line,4);

my $counterdesc = $countershash{$counter};

导致问题的行是最后一行。它说全局符号%counterhash需要显式包名。我不确定为什么它会给我错误。否则,没有任何问题,如果我评论脚本运行的那一行。散列被设置为键的错误代码和作为值的描述。我试图在$ countershash中获取特定键的值,因此我可以将错误描述添加到输出哈希。

2 个答案:

答案 0 :(得分:0)

问题是解除引用。你应该取消引用子程序中的哈希

my $counterdesc = $countershash->{$counter};

->这称为arrow operator,用于表示数组和哈希值。

答案 1 :(得分:0)

代码success: function (response) { orderId = response; if (response != null) { orderStatus = "Order has been placed successfully."; } } 表示"在哈希$counterhash{$counter}"中查找密钥$counter。您没有名为%counterhash的哈希,您在名为%counterhash的标量变量中有哈希引用。 $counterhash%counterhash是两个完全不同的变量。

为了在哈希引用中查找元素,您需要使用不同的语法。

$counterhash

请不要使用其他答案中使用的my $counterdesc = $countershash->{$counter}; 语法(以前)。这只会混淆六个月内需要维护代码的人(可能是你)。