Perl Global符号需要显式包名称

前端之家收集整理的这篇文章主要介绍了Perl Global符号需要显式包名称前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图将我的日志消息存储在散列中,具体取决于消息类型,如下所示:

#!/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,所以我不完全了解基础知识!请帮助我理解为什么无法访问此变量.

解决方法

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{...} ...

猜你在找的Perl相关文章