对于Seq对象数组,是否存在与IO::ScalarArray等效的Bioperl?
在Perl中,我们需要将数组元素处理为文件的行。在BioPerl中,我们有,它可以生成一个文件句柄,用于读取和写入对于Seq对象数组,是否存在与IO::ScalarArray等效的Bioperl?,perl,arrays,io,bioperl,Perl,Arrays,Io,Bioperl,在Perl中,我们需要将数组元素处理为文件的行。在BioPerl中,我们有,它可以生成一个文件句柄,用于读取和写入Bio::Seq对象,而不是表示文本行的字符串。我想结合使用这两种方法:我想获得一个句柄,从一个对象数组中读取连续的Bio::Seq对象。有没有办法做到这一点?对我来说,实现一个这样做的模块会很简单吗 我之所以希望这样做,是因为我希望能够编写一个子程序,该子程序接受Bio::SeqIO句柄或Bio::Seq对象数组,并且我希望避免根据我得到的输入类型编写单独的循环。也许以下内容比编写
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)
}
}
子过程\u序列{
我的$input=$\u0];
#从Bio::Seq数组或Bio::SeqIO数组中读取
我的$nextseq;
if(参考$input eq‘ARRAY’){
我的$pos=0
$nextseq=sub{return$input->[$pos++]if$pos<@$input};}
}
否则{
$nextseq=sub{$input->getline();}
}
而(my$seq=$nextseq->()){
用($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() }
}
}
my$nextseq=do{
如果(参考$input eq ref[]){
我的$pos=0;#如果您有Perl 5.10,可能是一个状态变量
sub{return$input->[$pos++]if$pos<@$input}
}
否则{
sub{$input->getline()}
}
}
不过,如果你对迭代器感兴趣,可以去看看马克·杰森·多米努斯(Mark Jason Dominus)的《迭代器》,他在《迭代器》中谈到了实现这类功能的各种方法。感谢你带领我学习HOP,这让我