Я не могу сказать вам, почему вы получаете вывод, который вы получаете, потому что код, который вы разместили, не является допустимым Perl и не будет компилироваться или запускаться - my @PID = '<'PID'>';
синтаксически неверен. (Это должно быть my @PID = <PID>;
, без кавычек.) Следовательно, это не тот код, который вы запускаете для получения этих результатов.
Причина, по которой вы не получаете совпадений, заключается в том, что, хотя опубликованный код имеет значение chomp(@MSD)
, он также не chomp(@PID)
, поэтому PID будут совпадать только в том случае, если за ними следует новая строка. Что, согласно опубликованным данным, это не так. (И даже если бы они были, chomp(@MSD)
удалил бы их.)
Исправление этого сдвигает вас на шаг ближе, но все равно не дает желаемых результатов, потому что ваше регулярное выражение неверно. Попробуйте это вместо этого (с $a
переименованным в $target
, потому что a: это более значимое имя, а b: $a
и $b
магические, поэтому вы не должны их использовать): m/'>' $target([^']*)/
Наконец, ваш цикл for ($i...)
неправильный, что очень легко сделать с C-style for
. Намного лучше использовать for (list)
.
Исправление всех этих вещей, а также переключение на лексические файловые дескрипторы и форму open
с тремя аргументами (как уже упоминалось Дэвидом Precious) и выполнение некоторой общей очистки кода, дает нам:
#!/usr/bin/env perl
use strict;
use warnings;
open my $pid_fh, '<', 'PID.txt';
my @PID = <$pid_fh>;
close $pid_fh;
chomp(@PID);
open my $msd_fh, '<', 'Seq.txt';
my @MSD = <$msd_fh>;
close $msd_fh;
chomp(@MSD);
my $msd = join(' ', @MSD);
my $output;
open my $outfile, '>>', 'data.txt';
for my $target (@PID) {
if ($msd =~ m/'>' $target([^']*)/) {
$output = ">" . $target . $1;
print $output, "\n";
print $outfile "$output\n";
}
}
... который производит вывод:
>SCO0755, putative ABC transporter 797720:799942 forward MW:79858 VSTAQETRGRRRAAPPRRSVPKSRARTVRTPTVLQMEAVECGAASLAMVLGHYGRHVPLE ELRIACGVSRDGSRASNLLKAARSYGFTAKGMQMDLAALAEVTAPAILFWEFNHYVVYDG
>SCO1144, putative ABC transporter ATP-binding protein 1202480:1204282 reverse MW:64637 MHPDRESAWTAPADAVEQPRQVRRILKLFRPYRGRLAVVGLLVGAASLVSVATPFLLKEI LDVAIPEGRTGLLSLLALGMIFGAVLTSVFGVLQTLISTTVGQRVMHDLRTAVYGRLQQM
Правильные последовательности выбраны; Я оставлю их в том формате, в котором вы их просили в качестве упражнения для читателя.