Есть ли в Bioperl эквивалент IO::ScalarArray для массива объектов Seq?
В Perl у нас есть IO::ScalarArray
для обработки элементов массива, как строки файла. В BioPerl мы имеем Bio::SeqIO
, который может производить файловый дескриптор, который читает и пишет Bio::Seq
объекты вместо строк, представляющих строки текста. Я хотел бы сделать комбинацию из двух: я хотел бы получить дескриптор, который читает последовательно Bio::Seq
объекты из массива таких объектов. Есть какой-либо способ сделать это? Было бы тривиально для меня реализовать модуль, который делает это?
Моя причина этого заключается в том, что я хотел бы написать подпрограмму, которая принимает либо Bio::SeqIO
ручка или массив Bio::Seq
объекты, и я хотел бы избежать написания отдельных циклов в зависимости от того, какой ввод я получаю. Возможно, следующее будет лучше, чем написать мой собственный модуль ввода-вывода?
sub process_sequences {
my $input = $_[0];
# read either from array of Bio::Seq or from Bio::SeqIO
my $nextseq;
if (ref $input eq 'ARRAY') {
my $pos = 0
$nextseq = sub { return $input->[$pos++] if $pos < @$input}; }
}
else {
$nextseq = sub { $input->getline(); }
}
while (my $seq = $nextseq->()) {
do_cool_stuff_with($seq)
}
}
1 ответ
Ваше решение выглядит так, как будто оно должно работать. Если вы действительно не хотите тратить много времени на решение этой проблемы, занимайтесь ею, пока она вам больше не понравится. Я мог бы написать это так, чтобы не вводить имя переменной несколько раз:
my $nextseq = do {
if (ref $input eq ref [] ) {
my $pos = 0; #maybe a state variable if you have Perl 5.10
sub { return $input->[$pos++] if $pos < @$input} }
}
else {
sub { $input->getline() }
}
}
Если вы заинтересованы в итераторах, посмотрите на Perl высшего порядка Марка Джейсона Доминуса, где он рассказывает о всевозможных способах выполнения подобных вещей.