autouse - 延後載入模組直到函式被使用
use autouse 'Carp' => qw(carp croak);
carp "this carp was predeclared and autoused ";
如果模組 Module
已載入,則宣告
use autouse 'Module' => qw(func1 func2($;$));
等同於
use Module qw(func1 func2);
如果 Module
定義 func2() 的原型為 ($;$)
,且 func1() 沒有原型。(至少如果 Module
使用 Exporter
的 import
,否則會發生致命錯誤。)
如果模組 Module
尚未載入,則上述宣告會在目前套件中宣告函式 func1() 和 func2()。當呼叫這些函式時,它們會載入套件 Module
(如果需要),並用正確的定義取代自己。
使用 autouse
會將程式執行中的重要步驟從編譯時間移到執行時間。這可能會
中斷程式的執行,如果 autouse
的模組有一些初始化,它預期在早期完成。
隱藏程式碼中的錯誤,因為重要的檢查(例如原型的正確性)從編譯時間移到執行時間。特別是,如果在 autouse
行指定的原型錯誤,你會在執行對應函式時才會發現。這對於不總是會被呼叫的函式來說非常不幸(請注意,對於此類函式,autouse
會帶來最大的好處,請參閱下列的解決方法)。
為了(部分)緩解第二個問題,建議你像這樣撰寫指令碼
use Module;
use autouse Module => qw(carp($) croak(&$));
carp "this carp was predeclared and autoused ";
第一行確保你的引數規格中的錯誤會在早期發現。當你發布應用程式時,你應該註解掉第一行,因為它讓第二行變得無用。
Ilya Zakharevich (ilya@math.ohio-state.edu)
perl(1)。