2013-05-01 116 views
3

我试图存储在根据消息类型的哈希我的日志信息,如下图所示:Perl的全局符号需要明确包名

#!/usr/bin/perl 

use strict; 
use warnings; 

my %log; 

opendir (DIR, '.') or die $!; 
while (my $file = readdir(DIR)) { 
    # some code to select TAR filename in $1 
    if (-e $1.'.tar') { 
     push(@{$log->{$1}}, $file); /* line 12 */ 
    } 
    else { 
     $log{$1} = []; 
     push(@{$log->{$1}}, $file); /* line 16 */ 
} 

下面这段代码给编译错误说:

Global symbol "$log" requires explicit package name at at lines 12 & 16 

其中我实际上试图使用散列“%log”。什么可以成为摆脱这种错误的可能方式?为什么会发生这种情况?

我没有看到上下文里的人回答说,变量是在一个环境中创建并正在另一提到了一些解释,但我觉得这个变量应该是可用的内部循环,而在这段代码。只有当我使用“严格使用”时才会发生这种情况,否则会正常工作。

我已经开始用Perl,所以我不完全理解的基础!请帮我理解为什么这个变量不可访问。

回答

8
my %log; 

定义散列%log,但第12行和第16行不使用它。相反,您正在访问您从未声明的标量$log引用的匿名散列。你有两个选择。

  • 您可以继续使用匿名散列。

    my $log = {}; # The creation of the hash ("{}") is currently being done 
           # implicitly by "->". This is called autovivification. 
    
    
    ... $log->{...} ... 
    

    这增加了一点额外的复杂性和不明显的速度降低。

  • 你可以使用直接使用的哈希值。

    my %log; 
    
    ... $log{...} ... 
    
+1

感谢您的详细回复。我在声明中知道这个标量和非标量变量的概念。我很感谢你带来了这个! – i01000001 2013-05-01 18:13:11

+0

那么对于完整性:'我的日志%;'声明散列,'我@log;'声明数组,'我的$ log';声明一个标量。这些是可以安全共存的三个无关变量(抛开可读性问题)。 – ikegami 2013-05-01 18:16:25

+0

这是一个敏感的社区..从来没有见过这个其他地方..或可我一直在寻找在错误的地方..反正我已经向您提出了..并注意到对标量和非标量第二个选项!再次感谢。 – i01000001 2013-05-01 18:36:58

9

我不知道什么是你想用$1做,但散列访问不是一个参考,所以更改:

$log->{$1} 

$log{$1} 

你得到了错误信息,说:Global symbol "$log" requires explicit package,因为$log变量未定义。请记住,%log$log是两个不同的变量(哈希VS标量)。

+1

感谢您的答复。我无法接受这两个答复作为我的问题的正确答案。不知道如何承认你的努力...可能是如果我可以分享一些声誉点..不要在这里的规则..我刚加入今天! – i01000001 2013-05-01 18:15:59

相关问题