gpt4 book ai didi

Perl 全局符号需要明确的包名

转载 作者:行者123 更新时间:2023-12-03 15:11:19 25 4
gpt4 key购买 nike

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

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

最佳答案

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{...} ...
  • 关于Perl 全局符号需要明确的包名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16321844/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com