为什么下面的代码中第 18 行需要显式的包名称?
#! /usr/bin/env perl
use strict;
use warnings;
use utf8;
use feature qw<say state>;
{
no strict;
no warnings;
$myRef{G4143} = 58;
$myRef{Emily} = 8;
$myRef{Angela} = 40;
}
#%myRef requires explicit package name
while (my ($key, $value) = each %myRef) {
say "$key=>$value";
}
exit(0);
如果我在第 18 行将主包添加到 %myRef,那么它就可以工作
#! /usr/bin/env perl
use strict;
use warnings;
use utf8;
use feature qw<say state>;
{
no strict;
no warnings;
$myRef{G4143} = 58;
$myRef{Emily} = 8;
$myRef{Angela} = 40;
}
#added package name and now it works
while (my ($key, $value) = each %main::myRef) {
say "$key=>$value";
}
exit(0);
为什么此示例中需要包名称?
最佳答案
您需要显式指定包名称,因为
-
strict
已启用和 -
%myRef
尚未在该范围或任何封闭范围内声明(使用my
、our
或use vars
)
您不需要前面的 block 中的包名称,因为 strict
在该 block 内关闭。
如果添加行 my %myRef;
(或者 our %myRef;
如果您希望它在当前文件和包之外可见)在 no strict
之前 block ,那么您将不再需要显式的包名称,也不需要 no strict
在 block 内。
还有no warnings
已经是多余的了,所以我建议删除它。在任何情况下,该 block 中都不会生成警告。
关于perl - 为什么某些全局符号需要显式的包名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60447494/