Есть ли в 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 высшего порядка Марка Джейсона Доминуса, где он рассказывает о всевозможных способах выполнения подобных вещей.

Другие вопросы по тегам