快速修复
@seq
一种方法是带着索引走过去。
my @fastaid;
for (my $i = 0; $i < @seq; ++$i) {
if ($seq[$i] =~ /\*\*\*\*\* No hits found \*\*\*\*\*/){
push @fastaid, $seq[$i - 5] if $i >= 5;
}
}
请注意从标量更改为名为 的数组@fastaid
,您可以使用它打印
print "Here are the IDs:\n";
print " - $_\n" for @fastaid;
甚至
print "Here are the IDs:\n",
map " - $_\n", @fastaid;
添加抛光剂
正如brian d foy
下面评论中的注释,代码可以更优雅,更直接地表达意图。
my $id_offset = 5;
my @fastaid;
for ($id_offset .. $#seq) {
if ($seq[$_] =~ /\*\*\*\*\* No hits found \*\*\*\*\*/){
push @fastaid, $seq[$_ - $id_offset];
}
}
如perldata 的“标量值”部分所述,$#seq
是索引或@seq
. ..
范围运算符正确处理长度@seq
小于$id_offset
元素的情况。
显式的 regex-bind 运算符仍然有点不靠谱。你可以和
my $id_offset = 5;
my @fastaid;
for my $i ($id_offset .. $#seq) {
for ($seq[$i]) {
push @fastaid, $seq[$i - $id_offset]
if /\*\*\*\*\* No hits found \*\*\*\*\*/;
}
}
或者如果您至少有 5.10 版
use feature 'switch';
# ...
my $id_offset = 5;
my @fastaid;
for my $i ($id_offset .. $#seq) {
given ($seq[$i]) {
when (/\*\*\*\*\* No hits found \*\*\*\*\*/) {
push @fastaid, $seq[$i - $id_offset];
}
}
}
历史记录
过去,有一些关于重新定位$#
以跟踪数组遍历的索引的讨论,因此您可以编写
for (@fastaid) {
if (/\*\*\*\*\* No hits found \*\*\*\*\*/) {
push @fastaid, $seq[$# - 5] if $# >= 5;
}
}
但这从未实现。