2013-04-24 106 views
1

我試圖寫一個Perl程序,它會分裂出一個FASTA頭:到它|分隔件我應該使用什麼數據結構來存儲.fasta頭文件集合?

gi|4140243|dbj|AB022087.1|_Xenopus_laevis_mRNA_for_cytochrome_P450,_complete_cds,_clone_MC1 

gi 
4140243 
dbj 
AB022087.1 
_Xenopus_laevis_mRNA_for_cytochrome_P450,_complete_cds,_clone_MC1 

我可以做到這一點使用split

my @hits = split(/\|/, $hits); 

my ($gi, $number, $gb, $id, $name); 
foreach (@hits) { 
    $gi.= "$hits[0]\n"; 
    $number .= "$hits[1]\n"; 
    $gb .= "$hits[2]\n"; 
    $id .= "$hits[3]\n"; 
    $name .= "$hits[4]\n"; 
} 

my @gi = split('\n', $gi); 
my @number = split('\n', $number); 
my @gb = split('\n', $gb); 
my @id = split('\n', $id); 
my @name = split('\n', $name); 

現在每個標題的每個部分(包含在$hits中)是單個數組中的一個元素。接下來我要做的是打印每個陣列的每個元素,以便我可以爲每個陣列生成元素[0]的列表,每個陣列的元素[1] ...

我不確定這是否需要散列哈希或數組數組。

我對perl相當陌生,所以任何建議都會大有幫助。

我也知道,上述可能不是實現我想要的最光滑的方式 - 再次,任何意見將是偉大的!

回答

2

$ hit是否包含一個頭或多個?如果它只有一個,那麼將其分解爲變量,您可以執行如下操作:

my ($gi, $number, $gb, $id, $name) = split(/\|/, $hits); 

並且每個變量都將包含相應的值。

如果$ hits包含多個標題,那麼首先只是分割線,然後在循環中分割每個標題。下面是一個例子,結果將是散列的數組:

my @hits = split(/\n/, $hits); 
my @result; 
for my hit (@hits) { 
    my ($gi, $number, $gb, $id, $name) = split(/\|/, $hits); 
    push(@result, { 
     gi => $gi, 
     number => $number, 
     gb => $gb, 
     id => $id, 
     name => $name, 
    }); 
} 

當然的示例不包括任何錯誤校驗(?比如 - 不頭字符串真正相匹配的格式或沒有),但你應該包括他們在實際應用中,如果需要的話。

PS:我覺得你真的要開始that

+0

嗨,謝謝你的回答。 $ hits包含多個由\ n分隔的標頭 – fugu 2013-04-24 11:35:59

+0

我更新了該帖子,並附上了該案例。 – 2013-04-24 12:10:28

+0

好的 - 我會玩一玩。感謝您的有用鏈接呢! – fugu 2013-04-24 16:27:07

1

一般來說,數組是同質的數據(「一堆東西」),而散列是異構數據(「名稱,數量,和一個生日「)。如果你的數據自然地分裂成一堆內部異構的東西(「一堆個人信息記錄,每一個都有一個名字,一個數字和一個生日)」,那麼自然數據結構就是一系列hashrefs(參見注釋#1)。

就你的情況而言,$hits是一個標題列表。所以我們將創建一個數組,將其稱爲@headers,其中的每個元素都是表示爲散列引用的單個標頭。我們可以把分隔的字符串到一個列表與split,我們可以把一個類型的列表到另一種map

my @headers = map { 
    make_header_hashref($_) 
} split(/\n/, $hits); 

sub make_header_hashref { 
    my ($header_string) = @_; 
    my ($gi, $number, $gb, $id, $name) = split(/\|/, $header_string); 

    return { 
     gi  => $gi, 
     number => $number, 
     gb  => $gb, 
     id  => $id, 
     name => $name, 
    }; 
} 

(我拆頭字符串轉化爲hashref頭成子,因爲 (一)這就是你在實際代碼中所做的事情;(b)它闡明瞭 的結構map。)

您現在有一個hashrefs數組,因此您可以遍歷它們,否則將頭作爲單位處理,而不是作爲 屬性的集合處理。

筆記#1:嗯,我們真的需要一個描述關聯的對象,實現爲表示記錄的對象數組。