Perl 通過 open 函數打開文件句柄,支持多種模式組合。理解模式標記含義是正確處理文件 IO 的前提。
| 模式 | 符號 | 讀 | 寫 | 創建 | 截斷 | 追加 |
|---|---|---|---|---|---|---|
| 只讀 | < 或 <: | ✓ | ✗ | ✗ | ✗ | ✗ |
| 只寫 | > | ✗ | ✓ | ✓ | ✓ | ✗ |
| 追加 | >> | ✗ | ✓ | ✓ | ✗ | ✓ |
| 讀寫 | +< | ✓ | ✓ | ✗ | ✗ | ✗ |
| 讀寫創建 | +> | ✓ | ✓ | ✓ | ✓ | ✗ |
use strict;
use warnings;
my $filename = 'data.txt';
open(my $fh, '<:encoding(UTF-8)', $filename)
or die "Could not open file '$filename': $!";
while (my $row = <$fh>) {
chomp $row;
print "$row\n";
}
close($fh);
特點:die 立即終止程序,輸出錯誤信息含行號,適合「必須存在」的文件。
use strict;
use warnings;
my $filename = 'data.txt';
if (open(my $fh, '<:encoding(UTF-8)', $filename)) {
while (my $row = <$fh>) {
chomp $row;
print "$row\n";
}
close($fh);
} else {
warn "Could not open file '$filename': $!";
}
特點:warn 輸出警告到 STDERR,程序繼續運行,適合「可選」的文件。
use strict;
use warnings;
my $filename = 'data.txt';
open(my $fh, '<', $filename)
or die "Could not open file '$filename': $!";
my @file_contents = <$fh>; # 列表上下文:每行成一個元素
close($fh);
for my $line (@file_contents) {
print $line; # 保留換行符
}
特點:一次性讀入內存,適合小文件;大文件會耗盡內存。
open(my $fh, '<:encoding(UTF-8)', $filename) # 明確模式、編碼、變量分離
# 避免雙參數 open 的安全隱患:open FH, "< $filename" 可能被注入管道命令
# Perl 5.14+ 支持
open(my $fh, '<', $filename) or die $!;
# 隱式作用域結束自動 close,或显式
close $fh;
| 場景 | 推薦方式 |
|---|---|
| 大文件、流式處理 | while (my $line = <$fh>) |
| 小文件、需隨機訪問 | my @lines = <$fh> |
| 只需前幾行 | for (1..3) { my $line = <$fh>; ... } |
| 反序處理 | 讀入數組後 reverse @lines |
:encoding(UTF-8) # 標準 UTF-8
:encoding(UTF-16LE) # UTF-16 小端
:raw # 二進制模式,無轉換
:crlf # Windows 換行符轉換
| 錯誤現象 | 原因 | 解決 |
|---|---|---|
| Permission denied | 無讀寫權限 | chmod、sudo、檢查 SELinux |
| No such file or directory | 路徑錯誤、相對路徑問題 | 使用絕對路徑、檢查 cwd |
| Wide character in print | UTF-8 字符未編碼輸出 | open 時指定 :encoding、或 encode() |
| 輸入亂碼 | 編碼不匹配 | 確認文件編碼、指定正確層 |
open、詞法文件句柄(my $fh):encoding(UTF-8))die/warn/if-elseclose 或依賴作用域自動關閉$! 系統錯誤碼Perl 文件操作靈活強大,關鍵在於:正確選擇打開模式、明確編碼層、合理的異常處理策略、內存效率考量。掌握三種核心模式(die、warn、數組讀入)與進階技巧,能應對 95% 的文本處理場景。