1

次のようなデータ構造があります。

#!/usr/bin/perl -w
my $hash = {
             'abTcells' => {
                             'mesenteric_lymph_node' => {
                                                         'Itm2a'   => '664.661',
                                                         'Gm16452' => '18.1425',
                                                         'Sergef'  => '142.8205'
                                                       },

                               'spleen'       =>   {  
                                                       'Itm2a' => '58.07155',
                                                       'Dhx9' => '815.2795',
                                                       'Ssu72' => '292.889'

                                                }
                            }
            };

私がやりたいのは、それをこの形式で印刷することです:

                mesenteric_lymph_node       spleen
Itm2a               664.661                 58.07155
Gm16452             18.1425                 NA
Sergef              142.8205                NA
Dhx9                 NA                     815.2795
Ssu72                NA                     292.889

それを行う方法は何ですか。

私は現在、次のコードで立ち往生していますhttps://eval.in/44207

foreach my $ct (keys %{$hash}) {
     print "$ct\n\n";
     my %hash2 = %{$hash->{$ct}};
       foreach my $ts (keys %hash2) {
       print "$ts\n";
       my %hash3 = %{$hash2{$ts}};
       foreach my $gn (keys %hash3) {
          print "$gn $hash3{$gn}\n";
       }
     }
 }
4

3 に答える 3

1

まず、2 つのハッシュを分離します。

my %lymph_node =  %{ $hash->{abTcells}->{mesenteric_lymph_node} };
my %spleen     =  %{ $hash->{abTcells}->{spleen} };

これで、必要なデータを含む 2 つの個別のハッシュができました。

必要なのは、すべてのキーのリストです。キーを含む 3 番目のハッシュを作成しましょう。

my %keys;
map { $keys{$_} = 1; } keys %lymph_node, keys %spleen;

これで、すべてのキーを調べて、2 つのハッシュのそれぞれの値を出力できます。ハッシュの 1 つにデータがない場合は、次のように設定しますNA

for my $value ( sort keys %keys ) {
    my $spleen_value;
    my $lymph_nodes_value;
    $spleen_value = exists $spleen{$value} ? $spleen{$value} : "NA";
    $lymph_node_value = exists $lymph_node{$value} ? $lymph_node{$value} : "NA";
    printf "%-20.20s  %-9.5f %-9.5f\n", $key, $lymph_node_value, $spleen_value;
}

このprintfステートメントは、データをテーブル化する優れた方法です。見出しは自分で作成する必要があります。の前のステートメント... ? ... : ...がtrue の場合、値は と の間の値になります。それ以外の場合、値は の後の値です。if/then/else??::

于 2013-08-21T05:57:20.120 に答える