do BLOCK

並非真正的函數。傳回 BLOCK 所指示的命令序列中最後一個命令的值。當由 whileuntil 迴圈修飾詞修改時,在測試迴圈條件之前先執行 BLOCK 一次。(在其他陳述式上,迴圈修飾詞會先測試條件。)

do BLOCK 不算迴圈,因此無法使用迴圈控制陳述式 nextlastredo 離開或重新啟動區塊。請參閱 perlsyn 以取得替代策略。

do EXPR

使用 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 會傳回評估的最後一個表達式的值。

最好使用 userequire 運算子來包含函式庫模組,它們也會進行自動錯誤檢查,並在發生問題時引發例外。

您可能想使用 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;
    }
}