-1

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

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;
            }

我得到的错误是:

全局符号“%stats”在 Import Routine Log Pars er.pl 第 45 行需要明确的包名称。

我没有收到此错误,并且脚本在use strict;删除时按需要运行。

我认为,由于我已在“更高”范围内声明它,因此循环内的代码应该可以访问它。为什么我会收到此错误?

4

3 回答 3

7

你没有得到strict vars错误;你得到一个strict refs错误。[更新:实际上,你两者都有!LHMathies 已经指出了strict vars错误,所以我不再提及。]

不存在范围界定问题。直接的错误是您将$stats->{priveleges}(字符串)的值视为数组引用。

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

是相同的

my $stats = { 'priveleges', 'missing_users' };

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

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

my $stats = {
    priveleges    => [],
    missing_users => [],
};
于 2013-04-30T18:12:22.890 回答
2

你的push说法在这里是错误的

push(@{$stats{priveleges}}, $1);

我想你想这样声明my $stats

my $stats = {
    foo => [],
    bar => [],
}

然后你可以推入这个数组参考:

push @{ $stat->{foo} }, $1;
于 2013-04-30T17:57:29.217 回答
0

正如错误消息告诉您的那样,$stats{privileges}正在尝试查看名为 的哈希%stats,但您在$stats. 试试这个作为第 45 行:

push(@{$stats->{privileges}}, $1);

既然您解决了所有其他问题,我认为它应该可以工作。

于 2013-05-01T11:46:10.707 回答