Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl需要显式的包名,但已在范围中定义(在没有严格限制的情况下工作)_Perl_Scope - Fatal编程技术网

Perl需要显式的包名,但已在范围中定义(在没有严格限制的情况下工作)

Perl需要显式的包名,但已在范围中定义(在没有严格限制的情况下工作),perl,scope,Perl,Scope,我的问题是,即使我在更高的范围内声明了变量,但当我使用它时,我被告知它需要显式的包名。代码如下: my $stats = { privileges => (), missing_users => () }; LINE: while (my $line = <$fh>) { chomp($line); next if $line eq ""; my $regex = ""; my $type = ""; whil

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

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;
            }
my$stats={
特权=>(),
缺少用户=>()
};
行:
while(我的$line=)
{
chomp($line);
下一个如果$line eq“”;
我的$regex=“”;
我的$type=“”;
while(($type,$regex)=每个(%%$entry\u regex))
{
如果($line=~/$regex/){
如果($type eq“EXCEPTION_PRIVS”)
44:         {
45:push(@{$stats{privileges}},$1);
46:下一行;
}
我得到的错误是:

全局符号“%stats”在导入时需要显式的包名 常规日志Pars er.pl第45行

我没有得到这个错误,当
use strict;
被删除时,脚本会按需要运行


我想既然我在“更高”的范围内声明了它,那么循环中的代码应该可以访问它。为什么我会出现这个错误?

您的
推送
语句在这里是错误的

push(@{$stats{priveleges}}, $1);
我想您应该像这样声明我的$stats:

my $stats = {
    foo => [],
    bar => [],
}
然后您可以推到这个数组ref上:

push @{ $stat->{foo} }, $1;

你没有得到一个
严格变量
错误;你得到的是一个
严格引用
错误。[更新:事实上,你两者都有!LHMathies已经指出了
严格变量
错误,所以我不再提了。]

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

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

my $stats = { 'priveleges', 'missing_users' };
这意味着生成的散列将有一个元素,其键为
privileges
(拼写错误),其值为
missing\u users

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

my $stats = {
    priveleges    => [],
    missing_users => [],
};

错误消息告诉您,
$stats{privileges}
正在尝试查找名为
%stats
的散列,但您在
$stats
中有一个散列引用。请在第45行尝试以下操作:

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

现在,您已经解决了所有其他问题,我认为它应该可以工作。

什么错误和变量?此外,您拼写错误的“特权”,这可能会导致以后的问题。
foreach my$line()
while(my$line=)的浪费版本
为此向各位道歉,我已经添加了错误消息和行引用。昨晚在匆忙中我忘记了这一点。我也更新了问题中的代码,以反映在这里提出建议后所做的更改。啊,有两个错误!我没有看到第二个错误。给出错误消息有帮助!(更好的是,还要提供可运行的代码,以便对修复进行测试。)
push
语句没有问题;数组引用将自动激活。@friedo,不,不会的。chrsblck的解释不是最好的,但他是对的。是的,你是对的。我认为
unde
将是一个字符串。实际上chrsblck也显示了这一点,但你没有应用修复的这一部分。