在Foo.pm中使用此代码:
use strict;
use warnings;
package Foo;
BEGIN {
$Foo::AUTHORITY = 'cpan:ETHER';
}
1;
将文件作为模块加载不会出错:
$ perl -I. -mFoo -e1
$
然而,直接加载文件会:
$ perl Foo.pm
Name "Foo::AUTHORITY" used only once: possible typo at Foo.pm line 6.
此外,perl -e'require "Foo.pm"'
也没有发出警告。
为什么会出现这种差异?显然,文件的解析方式不同, 但是如何以及为什么?
答案 0 :(得分:6)
“为什么”从技术角度,或从语言设计的角度来看?
从语言的角度来看,这是有道理的,因为模块中引用的变量很可能是模块的公共API的一部分。例如,Data :: Dumper公开了一堆改变其行为的包变量。 (可以说糟糕的设计,但是很好。)这些变量可能只在模块中引用一次,但可能会从程序的其他部分引用。
如果它只在主脚本中引用一次,并且没有模块引用它,那么它更可能是一个错误,所以我们在脚本中得到这个警告,但不在模块中。
从技术角度来看,此警告由gv.c
生成。就个人而言,我不能在触发它的确切条件下做头或尾。
答案 1 :(得分:0)
当然有例外,因为有些模块
if ($Me::Setting) {
...
} else {
...
}
我们并不总是our
和use vars
(后者取决于导入符号的其他例外)。
警告以warn
(Perl方)或Perl_warner
(C方)发出。有问题的行是this one。