对于Seq对象数组,是否存在与IO :: ScalarArray等效的Bioperl?

时间:2010-04-22 15:32:56

标签: perl arrays io bioperl

在Perl中,我们有IO::ScalarArray来处理数组的元素,就像文件的行一样。在BioPerl中,我们有Bio::SeqIO,它可以生成一个文件句柄,用于读取和写入Bio::Seq个对象,而不是表示文本行的字符串。我想将两者结合起来:我想获得一个句柄,从一组这样的对象中读取连续的Bio::Seq个对象。有没有办法做到这一点?实现这样做的模块对我来说是否微不足道?

我想要这个的原因是我希望能够编写一个接受Bio::SeqIO句柄或Bio::Seq个对象数组的子程序,我想避免单独编写基于我得到什么样的输入循环。也许以下比编写我自己的IO模块更好?

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 个答案:

答案 0 :(得分: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() }
     }
 }

如果你对迭代器感兴趣,请查看Mark Jason Dominus的Higher Order Perl,在那里他谈到了各种各样的方法来做这些事情。