如果它不是均勻地間隔,那麼什麼是有用知道的是:
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
還在工作一樣,例如默認將當前元素分割爲空白。