2016-09-14 69 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还在工作一样,例如默认将当前元素分割为空白。