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

4

使用Text::Table进行输出。美化入味

#!/usr/bin/env perl

use strict;
use warnings;

use Text::Table;

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'
        }
    }
};

my $struct = $hash->{abTcells};

my @cols = sort keys %{ $struct };
my @rows = sort keys %{ { map {
    my $x = $_;
    map { $_ => undef }
    keys %{ $struct->{$x} }
} @cols } };

my $tb = Text::Table->new('', @cols);

for my $r (@rows) {
    $tb->add($r, map $struct->{$_}{$r} // 'NA', @cols);
}

print $tb;

输出:

        肠系膜淋巴结脾
Dhx9 不适用 815.2795
GM16452 18.1425 不适用
Itm2a 664.661 58.07155
谢尔夫 142.8205 NA
Ssu72 NA 292.889

现在,上面行的顺序与您显示的不同,因为我希望它保持一致。如果您知道所有可能行的集合,那么您显然可以指定另一个顺序。

于 2013-08-21T03:29:26.487 回答
1

首先要做的是将两个哈希分开:

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

现在,您有两个单独的哈希值,其中包含您想要的数据。

我们需要的是所有键的列表。让我们创建包含您的密钥的第三个哈希。

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

现在,我们可以遍历所有键并打印两个哈希中的每一个的值。如果其中一个哈希没有数据,我们会将其设置为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语句是一种将数据表格化的好方法。您必须自己创建标题。该... ? ... : ...语句是缩写if/then/else如果 之前的语句?为真,则该值是介于?和之间的值:。否则,该值是 . 之后的值:

于 2013-08-21T05:57:20.120 回答
0

您的两个内部散列具有相同的键,因此对其中一个散列执行 foreach 以获取键,然后打印两者。

于 2013-08-21T03:28:35.763 回答