並非真正的函數。傳回 BLOCK 所指示的命令序列中最後一個命令的值。當由 while
或 until
迴圈修飾詞修改時,在測試迴圈條件之前先執行 BLOCK 一次。(在其他陳述式上,迴圈修飾詞會先測試條件。)
do BLOCK
不算迴圈,因此無法使用迴圈控制陳述式 next
、last
或 redo
離開或重新啟動區塊。請參閱 perlsyn 以取得替代策略。
使用 EXPR 的值作為檔案名稱,並將檔案內容當作 Perl 腳本執行
# load the exact specified file (./ and ../ special-cased)
do '/foo/stat.pl';
do './stat.pl';
do '../foo/stat.pl';
# search for the named file within @INC
do 'stat.pl';
do 'foo/stat.pl';
do './stat.pl'
在很大程度上類似於
eval `cat stat.pl`;
但它更簡潔,不會執行任何外部程序,並會追蹤目前檔案名稱以取得錯誤訊息。它也有所不同,因為使用 do FILE
評估的程式碼無法看到封閉範圍內的字彙;eval STRING
可以。然而,它相同的地方在於每次呼叫時都會重新解析檔案,因此您可能不希望在迴圈內執行此操作。
對相對路徑(./ 和 ../ 除外)使用 do
,例如
do 'foo/stat.pl';
將會搜尋 @INC
目錄,如果找到檔案,則會更新 %INC
。請參閱 "@INC" in perlvar 和 "%INC" in perlvar 以取得這些變數。特別注意,儘管在歷史上 @INC
包含 '.'(目前目錄),使這兩個案例相等,但現在不再一定如此,因為 '.' 在 perl 5.26.0 之後預設不包含在 @INC
中。相反地,perl 現在會警告
do "stat.pl" failed, '.' is no longer in @INC;
did you mean do "./stat.pl"?
如果 do
可以讀取檔案但無法編譯它,則會傳回 undef
,並在 $@
中設定錯誤訊息。如果 do
無法讀取檔案,則會傳回 undef,並將 $!
設定為錯誤。請務必先檢查 $@
,因為編譯可能會失敗,並同時設定 $!
。如果檔案編譯成功,則 do
會傳回評估的最後一個表達式的值。
最好使用 use
和 require
運算子來包含函式庫模組,它們也會進行自動錯誤檢查,並在發生問題時引發例外。
您可能想使用 do
來讀取程式設定檔。手動錯誤檢查可以這樣做
# Read in config files: system first, then user.
# Beware of using relative pathnames here.
for $file ("/share/prog/defaults.rc",
"$ENV{HOME}/.someprogrc")
{
unless ($return = do $file) {
warn "couldn't parse $file: $@" if $@;
warn "couldn't do $file: $!" unless defined $return;
warn "couldn't run $file" unless $return;
}
}