2013-07-17 28 views
2

有了这个代码在Foo.pm:为什么`perl Foo.pm`和`perl -I。 -mFoo -e1`表现不同?

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

您不必指定'-I.',当前目录始终包含在'@ INC'中。 – TLP

+2

@TLP - 不在污染模式 – mob

+0

@mob好吧,*几乎*总是。 – TLP

回答

6

从技术角度或从语言设计的角度来看“为什么”?

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

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

从技术角度来看,此警告是由gv.c生成的。就我个人而言,我无法对其触发的确切条件做出正确的判断。

0

当然是取得了异常,因为一些模块做

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

我们并不总是有ouruse vars(根据又一其他异常进口符号后者)。


警告与warn(Perl的一侧)或Perl_warner(C侧)发出的。有问题的线路是this one

+0

我也猜测,但我感兴趣的是具体的事实。谢谢! :) – Ether

+0

@Ether,然而,你接受了一个答案,使我有同样的教育猜测(公共API),同时没有提供我所做的证实(机制来声明没有使用存在)? – ikegami

+0

他连接到源,这证实这是有意的行为(并显示“如何”)。 – Ether

相关问题