Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于Seq对象数组,是否存在与IO::ScalarArray等效的Bioperl?_Perl_Arrays_Io_Bioperl - Fatal编程技术网

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

对于Seq对象数组,是否存在与IO::ScalarArray等效的Bioperl?,perl,arrays,io,bioperl,Perl,Arrays,Io,Bioperl,在Perl中,我们需要将数组元素处理为文件的行。在BioPerl中,我们有,它可以生成一个文件句柄,用于读取和写入Bio::Seq对象,而不是表示文本行的字符串。我想结合使用这两种方法:我想获得一个句柄,从一个对象数组中读取连续的Bio::Seq对象。有没有办法做到这一点?对我来说,实现一个这样做的模块会很简单吗 我之所以希望这样做,是因为我希望能够编写一个子程序,该子程序接受Bio::SeqIO句柄或Bio::Seq对象数组,并且我希望避免根据我得到的输入类型编写单独的循环。也许以下内容比编写

在Perl中,我们需要将数组元素处理为文件的行。在BioPerl中,我们有,它可以生成一个文件句柄,用于读取和写入
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,这让我