首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Perl 輸入記錄分隔符 ($/) 進階用法:自定義行分隔讀取基因數據

     編輯:Java 相關知識

Perl $/ 變數:重新定義「什麼是一行」

Perl 預設以換行符 `\n` 作為輸入記錄分隔符 (`$/`),但 `$/` 可設為任意字串,讓 `<FH>` 一次讀取一個「邏輯記錄」,極適合處理 FASTA、GenBank 等生物資訊格式。

範例資料 (strawberry1.gb 片段)

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

1. 預設行讀取

#!/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

2. 設定 $/ = "///\n" 讀取完整記錄

$/ = "///\n";
open(my $fh, '<', 'strawberry1.gb') or die $!;
my $record = <$fh>; # 讀到第一個 "///\n" 為止
print $record;
# 輸出: LOCUS...how 共 11 行 (含 /// 那行)

3. 設定 $/ = "how\n" 以關鍵字分隔

$/ = "how\n";
$record = <$fh>;
# 輸出: LOCUS...KEYWORDS    .\nhow

4. 設定 $/ = "ACCESSION" 以欄位名分隔

$/ = "ACCESSION";
$record = <$fh>;
# 輸出: LOCUS...//\nACCESSION

5. 陷阱:$/ = "/\n" 未匹配預期

$/ = "/\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);
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved