2013-07-17 27 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

相關問題