2016-09-22 32 views
7
use WWW::Mechanize; 
$mech = new WWW::Mechanize; 
$mech->get("http://www.google.com"); 
$html = HTML::TreeBuilder::XPath->new_from_content($mech->content); 
sub test 
{ 
    use HTML::TreeBuilder::XPath; 
} 

上面的代碼編譯,因此sub中的use語句正在全局應用。爲什麼sub中的use語句全局應用?

爲什麼perl這樣做?這沒有任何意義。

回答

4

這是perldoc狀態:

因爲use在編譯時生效,它不尊重代碼的普通流量控制正在編制。特別是,在條件的假分支中使用它並不妨礙它被處理。

不幸的是它沒有給出解釋爲什麼它是這樣設計的。可能的原因可能是:

  • 的Perl給你自由,很多在很多情況下(TIMTOWTDI)
  • use一個子程序內可以顯示你的意圖,你居然想只在一個特定的地方(使用一個模塊,即使它被全球加載)
  • 如果(重新)移動特定子程序(其中包含一個use)後,您不必擔心從其他地方刪除未使用的use就像你的腳本
  • 的頂部。 ..

儘管這些想法聽起來似乎合理,但我會避免在子程序中加載模塊,因爲它們都在一個位置而不是遍佈整個地方更清晰。

6

use Module;有兩個效果。

第一個是加載模塊。顯然,這具有全球效應。如果多個其他模塊使用它,則不希望多次加載模塊。

第二種是調用模塊的import方法。對於大多數模塊而言,這用於將符號導出到調用者的名稱空間,以便可以調用這些函數而無需使用完整的包名稱對其進行限定。這顯然影響的不僅僅是一些子,因爲沒有人給每個子自己的名字空間。但這真的取決於你。

然而,某些模塊的import方法做了一些完全不同的操作。它們改變了代碼在指令存在的詞彙範圍中的編譯方式。這些被稱爲雜注。 use strict;就是一個例子。在子模塊中使用這些模塊是有意義的。然而,在子中使用use HTML::TreeBuilder::XPath;是沒有意義的。

相關問題