【问题标题】:Join same hash of arrays values加入相同的数组值哈希
【发布时间】:2021-03-09 18:28:16
【问题描述】:

我有一个包含特定数据集的哈希。我需要操纵哈希值,以便得到如下结果:

预期输出:

key_1=Cell1
Val_1=C3#C4#C1#C2

脚本:

#!/usr/bin/perl

use strict; use warnings;

use Data::Dumper;
use List::Util qw /uniq/;

my %hash = (
        'Cell1' => {
                    'A' => [ 'C1','C2','C1','C2' ],
                    'B' => [ 'C3','C3','C4','C4' ]
        }
);

print Dumper(\%hash);

my $i = 0;

foreach my $key (keys %hash) {
    ++$i;
    print "key_$i=$key\n";
    foreach my $refs (keys %{ $hash{$key} }) {
        print "Val_$i=", join('#', uniq @{$hash{$key}{$refs}})."\n";    
    }
}

电流输出:

key_1=Cell1
Val_1=C3#C4
Val_1=C1#C2

我怎样才能在这里得到预期的输出?

【问题讨论】:

    标签: perl perl-hash


    【解决方案1】:

    显示的代码一次使用每个键的值(对于A,然后对于B ...)。相反,使用 map 在所有键列表中组装所有值

    my $i = 0;
    for my $key (keys %hash) { 
        ++$i;
        say "key_$i=$key";
        say "Val_$i=", 
            join "#", uniq map { @{ $hash{$key}->{$_} } } keys %{$hash{$key}};
    }
    

    【讨论】:

      【解决方案2】:

      您可以在打印之前使用额外的数组 (@cells) 来存储值:

      foreach my $key (keys %hash) {
          ++$i;
          print "key_$i=$key\n";
          my @cells;
          foreach my $refs (keys %{ $hash{$key} }) {
              push @cells, @{$hash{$key}{$refs}};
          }
          print "Val_$i=", join('#', uniq @cells)."\n";    
      }
      

      打印:

      key_1=Cell1
      Val_1=C3#C4#C1#C2
      

      由于您从哈希中检索键,因此无法保证顺序。您可以使用sort 使订单可预测。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-11
        • 1970-01-01
        相关资源
        最近更新 更多