簡単な修正
@seq
それを行う1つの方法は、インデックスを持って歩くことです。
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;
}
}
しかし、それは決して実現しませんでした。