为什么`perl Foo.pm`和`perl -I.-mFoo -e1`表现不同?

Eth*_*her 2 perl warnings module require

在Foo.pm中使用此代码:

use strict;
use warnings;
package Foo;

BEGIN {
  $Foo::AUTHORITY = 'cpan:ETHER';
}
1;
Run Code Online (Sandbox Code Playgroud)

将文件作为模块加载不会出错:

$ perl -I. -mFoo -e1
$
Run Code Online (Sandbox Code Playgroud)

然而,直接加载文件会:

$ perl Foo.pm
Name "Foo::AUTHORITY" used only once: possible typo at Foo.pm line 6.
Run Code Online (Sandbox Code Playgroud)

而且,perl -e'require "Foo.pm"'也没有警告.

为什么会出现这种差异?很明显,文件的解析方式不同,但是如何以及为什么?

tob*_*ink 6

"为什么"从技术角度来看,还是从语言设计的角度来看?

从语言的角度来看,这是有道理的,因为模块中引用的变量很可能是模块的公共API的一部分.例如,Data :: Dumper公开了一堆改变其行为的包变量.(可以说是糟糕的设计,但是很好.)这些变量可能只在模块中引用一次,但可能会从程序的其他部分引用.

如果它只在主脚本中引用一次,并且没有模块引用它,那么它更可能是一个错误,所以我们在脚本中得到这个警告,但不在模块中.

从技术角度来看,此警告是由此产生的gv.c.就个人而言,我不能在触发它的确切条件下做头或尾.