2016-09-14 66 views
0

我有以下格式的數據:在Perl分割陣列從新行製表符分隔

4.8e-38 140.9 4.3 5.8e-38 140.6 4.3 1.1 1 NP_001275340.1 ELF4-like protein [Solanum tuberosum]XP_0063 
4.8e-38 140.9 4.3 5.8e-38 140.6 4.3 1.1 1 XP_015080718.1 PREDICTED: protein ELF4-LIKE 3-like isoform X 
5.3e-38 140.7 4.4 6.3e-38 140.5 4.4 1.1 1 XP_016481343.1 PREDICTED: protein ELF4-LIKE 4-like [Nicotian 
5.4e-38 140.7 5.1 6.6e-38 140.4 5.1 1.1 1 XP_009784404.1 PREDICTED: protein ELF4-LIKE 4-like [Nicotian 

我已經創建了一個Perl的陣列,其中元件被存儲在新的生產線。例如,如果我打印$ARRAY[0],它使輸出爲:

4.8e-38 140.9 4.3 5.8e-38 140.6 4.3 1.1 1 NP_001275340.1 ELF4-like protein [Solanum tuberosum]XP_0063. 

我需要的是在列拆分數組,所以,如果我print "$ARRAY[8]",輸出應該是標識符/登錄號的列表(NP_001275340.1, XP_015080718.1) 。

我已經嘗試使用拆分功能,但由於數據不是統一分開的(例如,通過製表符或空格),我無法做到這一點。有什麼建議麼?

回答

3

如果它不是均勻地間隔,那麼什麼是有用知道的是:

split默認完成了「任何空白」

所以,你可以這樣做:

#!/usr/bin/env perl 

use strict; 
use warnings; 

while (<DATA>) { 
    my @array = split; 
    print $array[8],"\n"; 
} 

__DATA__ 
4.8e-38 140.9 4.3 5.8e-38 140.6 4.3 1.1 1 NP_001275340.1 ELF4-like protein [Solanum tuberosum]XP_0063 
4.8e-38 140.9 4.3 5.8e-38 140.6 4.3 1.1 1 XP_015080718.1 PREDICTED: protein ELF4-LIKE 3-like isoform X 
5.3e-38 140.7 4.4 6.3e-38 140.5 4.4 1.1 1 XP_016481343.1 PREDICTED: protein ELF4-LIKE 4-like [Nicotian 
5.4e-38 140.7 5.1 6.6e-38 140.4 5.1 1.1 1 XP_009784404.1 PREDICTED: protein ELF4-LIKE 4-like [Nicotian 

split也允許你指定一個regex

my @array = split /(?:\t| +)/; 

這將讓你劈在標籤一個或多個空格,而不是陷入了雙重標籤的空場。請注意 - 您需要?:,因爲split ...將捕獲並將其添加到它返回的列表中。

而且它也可以讓你指定一個字段限制 - 因爲你的「最後」字段看起來就像是一個描述:

my @array = split ' ', $_, 10; 

這將工作同樣爲$array[8]$array[9]將包含:「預言:蛋白質ELF4 -LIKE 3-like isoform X「

問題的真正根源在於,如果您已經將所有文件讀入數組中 - 您擁有的是一行數組。

可以改造這個 - 無論是在輸入的時間(如在上面的例子中)或經由map

#!/usr/bin/env perl 

use strict; 
use warnings; 
use Data::Dumper; 

my @input = <DATA>; 
print Dumper \@input; 
print join "\n", map { (split)[8] } @input; 

__DATA__ 
4.8e-38 140.9 4.3 5.8e-38 140.6 4.3 1.1 1 NP_001275340.1 ELF4-like protein [Solanum tuberosum]XP_0063 
4.8e-38 140.9 4.3 5.8e-38 140.6 4.3 1.1 1 XP_015080718.1 PREDICTED: protein ELF4-LIKE 3-like isoform X 
5.3e-38 140.7 4.4 6.3e-38 140.5 4.4 1.1 1 XP_016481343.1 PREDICTED: protein ELF4-LIKE 4-like [Nicotian 
5.4e-38 140.7 5.1 6.6e-38 140.4 5.1 1.1 1 XP_009784404.1 PREDICTED: protein ELF4-LIKE 4-like [Nicotian 

在上述例子中,map迭代的@input每個元素,做了分裂,並且選擇場8 - 並將其作爲列表返回。

所以,你可以:

my @identifiers = map { (split)[8] } @input; 

注 - split還在工作一樣,例如默認將當前元素分割爲空白。