我有以下格式的数据:
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
)。
我尝试过使用分割功能,但由于数据没有统一分开(例如,通过制表符或空格),我无法做到这一点。有什么建议吗?
答案 0 :(得分: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
仍然有效,例如默认将当前元素拆分为空格。