4

私は Perl を初めて使用しましたが、ひどい HTML ファイルからテキストを取得するために Perl が必要でした。これまでのコードでは、必要なすべての値を抽出したところまで来ました (データ ダンパーで動作することを確認しました)。

すべてのデータ レコード、つまり 2D テーブルの行に対して、次のように呼ばれます。

$org, $gene_name, $number, $motif_num, $pos, $strand, $seq

多くのデータエントリがあり、それぞれが行になり、上記の値が列になります。

後でそれらを使って他のことを行うために、2D 配列構造を作成したいので、各エントリ (行) をループして、必要な値を選択することができます。

これを行う最善の方法は、ループを使用し、データエントリごとに、正規表現マッチングで値を抽出した後、値/列を個々のデータレコードの配列に結合することだと思いました:

my @seidl_array_row = ($org, $gene_name, $number, $motif_num, $pos, $strand, $seq);

次に、この配列を配列の完成した 2D 配列にプッシュします。

push @seidl_array, [ @seidl_array_row ];

( @seidl_array はmyループの前に定義されています。)

つまり、配列 @seidl_array の各要素は、値 $org、$gene_name、$number、$motif_num、$pos、$strand、および $seq を含む配列です。

私は Perl を初めて使用するので、このデータを後で処理するときに問題が発生するため、これがプログラムで行う正しい方法であったかどうかはわかりません。そもそも問題は、配列の配列をどのように構築したかにあるのだろうかと思いました。私の本の例では、単純なデータセットで静的に実行していますが、これははるかに大きなゲノムデータの gtf ファイルであるため、静的に実行することは実際には実現可能ではありません。

4

2 に答える 2

7

私が見る限り、あなたのアプローチには何の問題もありません。choroba が提案したように、配列をコピーする代わりに配列への参照を使用すると、データが不必要にコピーされないという利点があります (ただし、ループ内で@seidl_array_row を宣言した場合にのみ機能します。それ以外の場合は、いくつかの参照を作成するだけです)。同じアレイに)。

次のように行配列を完全にスキップすることで、同じ利点を得ることができます。

push @seidl_array, [ $org, $gene_name, $number, $motif_num, $pos, $strand, $seq ];

データへのアクセスをさらに便利にするために、次のようなハッシュの配列をよく使用します。

push @seidl_array, {
    org    => $org,
    name   => $gene_name,
    number => $number,
    motif  => $motif_num,
    pos    => $pos,
    strand => $strand,
    seq    => $seq,
};

これには、配列内のそれぞれの値の位置を覚えておく必要がなく、名前でアクセスできるという利点があります。

于 2013-04-15T12:36:05.693 に答える
4

あなたの解決策は私には正しいようです。を使用[ @seidl_array_row ]すると、リストのコピーが作成されます。ループ内で行を正しく宣言している場合は、myその参照を直接保存して、不要なコピーを避けることができます。

push @seidl_array, \@seidl_array_row;
于 2013-04-15T12:28:34.290 に答える