我遇到的问题是,即使我已经在更高的范围内声明了我的变量,当我去使用它时,我被告知它需要显式的包名.代码如下:
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;删除.
我认为,因为我已经在一个"更高"的范围内声明它应该可以访问循环中的代码.为什么我收到此错误?
你没有得到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)