Есть ли в Bioperl IO :: ScalarArray для массива объектов Seq? - PullRequest
3 голосов
/ 22 апреля 2010

В 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 Ответ

1 голос
/ 22 апреля 2010

Ваше решение выглядит так, как будто оно должно работать. Если вы действительно не хотите тратить много времени на решение этой проблемы, занимайтесь ею, пока она вам больше не понравится. Я мог бы написать это так, чтобы не вводить имя переменной несколько раз:

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

...