2

在 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"'也不警告。

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

4

2 回答 2

6

“为什么”是从技术的角度,还是从语言设计的角度?

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

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

从技术角度来看,此警告是由gv.c. 就个人而言,我无法确定触发它的确切条件。

于 2013-07-17T17:01:35.143 回答
0

肯定是例外,因为某些模块确实

if ($Me::Setting) {
   ...
} else {
   ...
}

我们并不总是有ourand use vars(后者取决于导入符号的另一个例外)。


warn(Perl 端)或Perl_warner(C 端)发出警告。有问题的行是这一行。

于 2013-07-17T16:57:36.480 回答