3

在 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)
    }
}
4

1 回答 1

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,其中他谈到了做这些事情的各种方法。

于 2010-04-22T15:57:00.073 回答