手動方式

open my $fh, '<', $filename
    or die "Could not open $filename for reading: $!";
my $contents = do { local $/; <$fh> };

開啟檔案後(如果你想讀取特定的檔案編碼而不是原始位元組,請閱讀 man perlio),技巧在 do 塊中:<$fh>,菱形運算子中的檔案控制代碼,從檔案中返回單個記錄。 輸入記錄分隔符變數 $/指定記錄是什麼 - 預設情況下它被設定為換行符,因此記錄表示單行。由於 $/是一個全域性變數,local 做了兩件事:它建立了 $/的臨時本地副本,它將在塊的末尾消失,並給它(非)值 undef(Perl 給未初始化的)變數)。當輸入記錄分隔符具有該(非)值時,菱形運算子將返回整個檔案。 (它將整個檔案視為一行。)

使用 do,你甚至可以手動開啟檔案。對於重複閱讀檔案,

sub readfile { do { local(@ARGV,$/) = $_[0]; <> } }
my $content = readfile($filename);

可以使用。這裡,另一個全域性變數(@ARGV)被本地化以模擬在使用引數啟動 perl 指令碼時使用的相同過程。$/仍然是 undef,因為它前面的陣列吃掉所有傳入的引數。接下來,鑽石運算子 <> 再次傳送由 $/(整個檔案)定義的一條記錄,並從 do 塊返回,而 do 塊又從 sub 返回。

sub 沒有明確的錯誤處理,這是不好的做法! 如果在讀取檔案時發生錯誤,你將收到 undef 作為返回值,而不是空檔案中的空字串。

最後一個程式碼的另一個缺點是你不能將 PerlIO 用於不同的檔案編碼 - 你總是得到原始位元組。