手動方式
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 用於不同的檔案編碼 - 你總是得到原始位元組。