perl - 对于 Seq 对象数组,是否存在相当于 IO::ScalarArray 的 Bioperl?

标签 perl arrays io bioperl

在 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/

相关文章:

perl - 在 Perl 中更改哈希值的输出

perl - 找出哪些脚本正在调用 perl 包

arrays - 从数组中删除重复的 PHAssets?

jquery - 数组删除\t\n。 --NodeJS--

Python 有时无法读取整个文件

python - 将 Tecplot ascii 转换为 Python numpy

mysql - 与 MySQL 一起使用多年的 Perl 脚本在升级到 MariaDB 后不再起作用

perl - 在 perl 中从函数返回 +{} 或 {} 与返回 ref 或 value 之间的区别

python - Numpy:高效访问 numpy.split 生成的子数组

java - 同步和IO文件