在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)
}
}
答案 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,在那里他谈到了各种各样的方法来做这些事情。