如果它不是均匀地间隔,那么什么是有用知道的是:
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
还在工作一样,例如默认将当前元素分割为空白。