Perl 預設以換行符 `\n` 作為輸入記錄分隔符 (`$/`),但 `$/` 可設為任意字串,讓 `<FH>` 一次讀取一個「邏輯記錄」,極適合處理 FASTA、GenBank 等生物資訊格式。
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
#!/usr/bin/perl
open(my $fh, '<', 'strawberry1.gb') or die "無法開啟: $!";
my $record = <$fh>; # 只讀第一行
print $record;
# 輸出: LOCUS JX118024 460 bp DNA linear PLN 25-SEP-2012
$/ = "///\n";
open(my $fh, '<', 'strawberry1.gb') or die $!;
my $record = <$fh>; # 讀到第一個 "///\n" 為止
print $record;
# 輸出: LOCUS...how 共 11 行 (含 /// 那行)
$/ = "how\n";
$record = <$fh>;
# 輸出: LOCUS...KEYWORDS .\nhow
$/ = "ACCESSION";
$record = <$fh>;
# 輸出: LOCUS...//\nACCESSION
$/ = "/\n";
$record = <$fh>;
# 輸出: LOCUS...//\nACCESSION...\n// (讀到第二個 //\n)
# 原因: 第 4 行 "/" 其實是 "//" (兩個斜線),單獨 "/" 不存在
修正:刪除第 4 行多餘內容,只留單獨 `/`,再匹配即可。
$/ 可設為多字元字串,不限單字元。undef` 或 `''` (空字串) 進入段落模式:以空白行 (`\n\n+`) 分隔。local $/ = "...";` 在區塊內生效,離開自動恢復,不影響全域。# FASTA 格式:以 ">" 開頭分隔序列
local $/ = ">";
while (my $rec = <$fh>) {
chomp $rec;
next unless $rec;
my ($header, @seqLines) = split /\n/, $rec;
my $seq = join '', @seqLines;
process($header, $seq);
}
# GenBank:以 "//\n" 分隔完整條目
local $/ = "//\n";
while (my $entry = <$fh>) {
parse_genbank($entry);
}