<FILEHANDLE> 的讀取粒度Perl 預設按 \n 讀取「一行」。通過修改特殊變量 $/(輸入記錄分隔符),可將「行」重新定義為任意字串,實現按段落、按標記、按固定標識塊讀取。本文以 GenBank 格式生物序列文件為例,演示 $/ = "///\n"、$/ = "how\n"、$/ = "ACCESSION" 等不同分隔符的效果。
$/ 預設為 "\n"。$fh = <FILEHANDLE> 讀取直到遇到 $/(包含分隔符),返回含分隔符的字串。undef 時一次讀取整個文件(slurp 模式)。""(空字串)時啟用「段落模式」:連續空行作為分隔。local $/ = "///\n"; 限制作用域,避免污染全局。LOCUS JX118024 460 bp DNA linear PLN 25-SEP-2012 DEFINITION Fragaria vesca subsp. americana RNA polymerase beta subunit (rpoC1) gene, partial cds; plastid. / ACCESSION JX118024 // VERSION JX118024.1 GI:402238751 KEYWORDS . how /// SOURCE plastid Fragaria vesca subsp. americana
| 設定 | 讀取結果(第一次 <DNAFILENAME>) |
|---|---|
$/ = "\n" (預設) | LOCUS JX118024 460 bp DNA linear PLN 25-SEP-2012\n |
$/ = "///\n" | 從開頭到第一個 ///\n 的所有內容(含標頭、定義、ACCESSION 等) |
$/ = "how\n" | 同前,因 how 出現在 /// 之前 |
$/ = "ACCESSION" | 從開頭到 ACCESSION(含) |
$/ = "/\n" | 匹配單獨 /\n 的行;若該行含其他字符則不匹配(需精確) |
#!/usr/bin/perl
use strict; use warnings;
open(my $fh, '<', 'strawberry1.gb') or die "Can't open: $!";
# 示例:按 ///\n 讀取記錄
local $/ = "///\n";
my $record = <$fh>;
print "--- 記錄 1 ---\n$record";
# 後續可繼續讀取下一記錄
$record = <$fh>;
print "--- 記錄 2 ---\n$record" if defined $record;
close($fh);
---END---、==== 分隔多行事件。[section] 讀取區塊。/\n 不匹配 / \n。$/ 僅接受字面字串,不可用正則。複雜邊界需讀大塊後自行切分。\r\n、Unix \n,設定分隔符時需匹配實際文件格式。