2016-08-19 50 views
0

我打电话一个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}; 

引起该问题的行是最后一行。它表示全局符号%countershash需要显式包名称。我不知道为什么它给了我这个错误。如果我在脚本运行时注释该行,则没有任何其他问题。哈希被设置为密钥的错误代码和作为值的描述。我试图获取$ countershash中特定键的值,以便将错误描述添加到输出哈希。

+1

此外,不再需要在函数调用的前面加上'&'。 – xxfelixxx

+0

对不起。澄清。它抱怨%反击。我意识到我已经删除了错误定义$ counter的行 –

+0

将它称为'$ countershash - > {$ counter}' – xxfelixxx

回答

0

问题是解引用。您应该取消引用子程序

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

->内哈希这就是所谓的arrow operator这是用来尊重的数组和散列。

+1

请不要向人们展示可怕的语法。从哈希引用中获取元素的推荐方法是使用' - >'。所以,'我的$ counterdesc = $ counterhash - > {$ counter};'。 –

+1

@DaveCross感谢您编辑了您的评论文章。 :) – mkHun

0

代码$counterhash{$counter}表示“在散列%counterhash中查找密钥$counter”。您没有名为%counterhash的散列,您在名为$counterhash的标量变量中有散列引用。 %counterhash$counterhash是两个完全不同的变量。

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

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

请不要使用$$countershash{$counter}语法(以前)在另一个答案中使用。这只会混淆谁需要在六个月的时间内维护你的代码(这可能是你)。