3

PerlではIO::ScalarArray、配列の要素をファイルの行のように扱う必要があります。BioPerlには、テキスト行を表す文字列の代わりにオブジェクトBio::SeqIOを読み書きするファイルハンドルを生成できるがあります。Bio::Seqこの2つを組み合わせて実行したいと思い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)
    }
}
4

1 に答える 1

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をチェックしてください。そこで彼は、この種のことを行うあらゆる種類の方法について語っています。

于 2010-04-22T15:57:00.073 に答える