加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl Global符号需要显式包名称

发布时间:2020-12-15 23:29:26 所属栏目:大数据 来源:网络整理
导读:我试图将我的日志消息存储在散列中,具体取决于消息类型,如下所示: #!/usr/bin/perluse 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(@
我试图将我的日志消息存储在散列中,具体取决于消息类型,如下所示:

#!/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{...} ...

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读