Perl需要显式的包名,但已在范围内定义(无严格工作)

dee*_*392 -1 perl scope

我遇到的问题是,即使我已经在更高的范围内声明了我的变量,当我去使用它时,我被告知它需要显式的包名.代码如下:

my $stats = {
    privileges => (),
    missing_users => ()
};

LINE:
while (my $line = <$fh>)
{
    chomp($line);
    next if $line eq "";

    my $regex = "";
    my $type = "";

    while (($type, $regex) = each(%$entry_regex))
    {
        if ($line =~ /$regex/) {
            if ($type eq "EXCEPTION_PRIVS")
44:         {
45:             push(@{$stats{privileges}}, $1);
46:             next LINE;
            }
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

全局符号"%stats"需要在Import Routine Log Pars er.pl第45行显式包名.

我没有收到此错误,并且脚本会根据需要运行,何时use strict;删除.

我认为,因为我已经在一个"更高"的范围内声明它应该可以访问循环中的代码.为什么我收到此错误?

ike*_*ami 7

你没有得到strict vars错误; 你收到了一个strict refs错误.[更新:实际上,你们两个都有!LHMathies指出了这个strict vars错误,所以我再也不提了.]

没有范围问题.立即错误是您将$stats->{priveleges}(字符串)的值视为数组引用.

my $stats = {
    priveleges    => (),
    missing_users => (),
};
Run Code Online (Sandbox Code Playgroud)

是相同的

my $stats = { 'priveleges', 'missing_users' };
Run Code Online (Sandbox Code Playgroud)

意味着生成的哈希将有一个元素,其键是priveleges(拼写错误的),其值是missing_users.

要创建匿名数组,请使用[].

my $stats = {
    priveleges    => [],
    missing_users => [],
};
Run Code Online (Sandbox Code Playgroud)