0

データの負荷を配列のハッシュのハッシュに整理しようとしています。値などを手動で宣言している場合、次は正常に機能します。

#!/usr/bin/perl
use warnings;
use strict;
use Data::Dumper;
$Data::Dumper::Sortkeys = 1;


my %experiment = (
    'gene1' =>  {
                       'condition1' => ['XLOC_000157', '90', '0.001'],
                       'condition2' => ['XLOC_000347','80', '0.5'],
                       'condition3' => ['XLOC_000100', '50', '0.2']
                   },
    'gene2'   =>  {
                       'condition1' => ['XLOC_025437', '100', '0.018'],
                       'condition2' => ['XLOC_000322', '77', '0.22'],
                       'condition3' => ['XLOC_001000', '43', '0.002']

                   }
);

次に、キー/値を出力します。

for my $gene (sort keys %experiment) {
    for my $condition ( sort keys %{$experiment{$gene}} ) {
        print "$gene\t$condition\t";
            for my $values (@{$experiment{$gene}{$condition}} ) {
                print "[$values]\t";
            }
        print "\n";
     }
}

出力:

gene1   condition1  [XLOC_000157]   [90]    [0.001] 
gene1   condition2  [XLOC_000347]   [80]    [0.5]   
gene1   condition3  [XLOC_000100]   [50]    [0.2]   
gene2   condition1  [XLOC_025437]   [100]   [0.018] 
gene2   condition2  [XLOC_000322]   [77]    [0.22]  
gene2   condition3  [XLOC_001000]   [43]    [0.002] 

ただし、私が取り組んでいる実際のデータは大きすぎて手動で宣言できないため、上記と同じ結果を達成できるようにしたいのですが、各フィールドを含む配列から始めます。次に例を示します。

入力例:

condition1    XLOC_000157    1.04564    0.999592      99.66   gene1
condition1    XLOC_000159    0.890436    0.999592    99.47   gene2
condition2    XLOC_000561    -1.05905    0.999592      91.57   gene1
condition2    XLOC_00076    -0.755473    0.999592      99.04   gene2

入力を配列に分割します。

my (@gene, @condition, @percent_id, @Xloc, @change, @q_value @split, %experiment);
while (<$list>) {
    chomp;
    @split = split('\t');
    push @condition, $split[0];
    push @Xloc, $split[1];
    push @change, $split[2];
    push @q_value, $split[3];
    push @percent_id, $split[4];
    push @gene, $split[5];
}   

私はHoAを構築して、これを次のように保存しています:

push @{$results{$gene_name[$_]} }, [ $Xloc[$_], $change, $q_value, $percent_id[$_] ] for 0 .. $#gene_name;

しかし、私は現在、各 HoA の「状態」情報を統合して、HoHoA を構築しようとしています。理想的には、上記と同様の方法で while ループ内で (したがって「動的に」) これを実行して、次のデータ構造を実現したいと考えています。

$VAR1 = {
          'gene1' => {
                       'condition1' => [
                                         'XLOC_000157',
                                         '1.04564',
                                         '0.999592',
                                         '99.66'
                                       ],
                       'condition2' => [
                                         'XLOC_000561',
                                         '-1.05905',
                                         '0.999592'
                                         '91.57'

                                       ],

                     },
          'gene2' => {
                       'condition1' => [
                                         'XLOC_000159',
                                         '0.890436',
                                         '0.999592'
                                         '99.47'

                                       ],
                       'condition2' => [
                                         'XLOC_00076',
                                         '-0.755473',
                                         '0.999592'
                                         '99.04'

                                       ],

                     }
        };
4

1 に答える 1

1
my %experiment;
while (<$list>) {
    chomp;
    my ($condition, $xloc, $percent_id, $gene) = split /\t/;
    $experiment{$gene}{$condition} = [ $xloc, $percent_id ];
}
于 2013-09-11T14:25:34.803 に答える