在 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)
}
}
最佳答案
您的解决方案看起来应该可以工作。除非你真的想花很多时间解决这个问题,否则就一直坚持下去,直到你不再喜欢它为止。我可能会这样写以避免多次键入变量名:
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 ,在那里他谈到了做这些事情的各种方法。
关于perl - 对于 Seq 对象数组,是否存在相当于 IO::ScalarArray 的 Bioperl?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2692203/