5

我正在尝试根据消息类型将我的日志消息存储在哈希中,如下所示:

#!/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”。有什么可能的方法来摆脱这个错误?为什么会发生这种情况?

我确实看到了一些关于上下文的解释,人们回答说变量是在一个上下文中创建并在另一个上下文中引用的,但我觉得这个变量应该在这段代码的 while 循环中可用。这只发生在我“使用严格”并且工作正常时。

我是从 Perl 开始的,所以我不完全了解基础知识!请帮助我了解为什么无法访问此变量。

4

2 回答 2

10
my %log;

定义了 hash %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{...} ...
    
于 2013-05-01T17:14:25.510 回答
9

我不确定您要做什么$1,但哈希访问不是参考,因此请更改:

$log->{$1}

$log{$1}

您收到的错误消息是:Global symbol "$log" requires explicit package,因为$log未定义变量。请记住,%logand$log是两个不同的变量(散列与标量)。

于 2013-05-01T16:11:58.347 回答