【问题标题】:PERL, comparing 2 hashes, list all keys and all values even if they are differentPERL,比较 2 个哈希,列出所有键和所有值,即使它们不同
【发布时间】:2014-04-18 11:50:46
【问题描述】:

这是我的情况:

%h1 = {
    'a' => 1,
    'b' => 3,
    'c' => 10,
    'x' => 12
}

%h2 = {
    'd' => 3,
    'f' => 5,
    'a' => 10,
    'x' => 0,5
}

我想要这个输出:

h1, a, 1 | h2, a, 10
h1, c, 10 | h2, c, -
h1, f, - | h2, f, 5

等等…… 如果键相同,我可以使用我的代码比较两个哈希, 但是我什么都做不了

foreach my $k(keys(%bg)) {
    foreach my $k2 (keys(%sys)) {
        if ($k eq $k2){
            print OUT "$k BG :  $bg{$k} SYS: $sys{$k2}\n";
        }
    }
}

【问题讨论】:

    标签: perl hash comparison associative-array


    【解决方案1】:

    听起来您只想遍历两个哈希之间的唯一键:

    use strict;
    use warnings;
    
    use List::MoreUtils qw(uniq);
    
    my %h1 = ('a' => 1, 'b' => 3, 'c' => 10, 'x' => 12);
    my %h2 = ('a' => 10, 'd' => 3, 'f' => 5, 'x' => 0);
    
    for my $k (sort +uniq (keys %h1, keys %h2)) {
        printf "%s h1: %-2s h2: %-2s\n", map {$_//'-'} ($k, $h1{$k}, $h2{$k});
    }
    

    输出:

    a h1: 1  h2: 10
    b h1: 3  h2: -
    c h1: 10 h2: -
    d h1: -  h2: 3
    f h1: -  h2: 5
    x h1: 12 h2: 0
    

    【讨论】:

    • 你能解释一下吗:printf "%s h1: %-2s h2: %-2s\n", map {$_//'-'} ($k, $h1{$ k}, $h2{$k});
    • 相关文档是:printfsprintf%s%-2s 的意思)、map,最后是 //
    【解决方案2】:
    #!/usr/bin/env perl
    
    use strict;
    use warnings;
    
    use Text::Table;
    
    my %h1 = ('a' => 1, 'b' => 3, 'c' => 10, 'x' => 12);
    my %h2 = ('a' => 10, 'd' => 3, 'f' => 5, 'x' => 0);
    
    my $table = Text::Table->new(
        'Key',    \' | ',
        'Hash 1', \' | ',
        'Hash2'
    );
    
    $table->load(
        map [$_, $h1{$_}, $h2{$_}],
        sort keys %{{ map {$_ => 1} keys %h1, keys %h2}}
    );
    
    print $table;
    

    输出:

    键 |哈希 1 |哈希2
    一个 | 1 | 10
    乙 | 3 |
    c | 10 |
    d | | 3
    f | | 5
    x | 12 | 0

    【讨论】:

    • 我喜欢你的风格。 +1
    【解决方案3】:

    我认为您需要对哈希进行完全连接。循环通过第一个哈希并从第二个哈希中获取相应的值,并对第二个哈希执行相同的操作。

    my %h1 = (
    'a' => 1,
    'b' => 3,
    'c' => 10,
    'x' => 12
    );
    
    my %h2 = (
    'd' => 3,
    'f' => 5,
    'a' => 10,
    'x' => 0
    );
    
    my %res;
    
    foreach my  $k (keys %h1){
     $res{$k}="h1" . "," . "$k"   . "," . ($h1{$k} eq "" ? "-" : $h1{$k}) . "|" . "h2" . "," . "$k" . "," . ($h2{$k} eq "" ? "-" : $h2{$k});
    }
    
    
    foreach my  $k (keys %h2){
     $res{$k}="h1" . "," . "$k"   . "," . ($h1{$k} eq "" ? "-" : $h1{$k}) . "|" . "h2" . "," . "$k" . "," . ($h2{$k} eq "" ? "-" : $h2{$k});
    }
    
    
    foreach my $k (sort keys %res){
    print $res{$k} . "\n"; 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-05
      • 1970-01-01
      相关资源
      最近更新 更多