加入相同的数组值散列

Join same hash of arrays values

我有一组特定数据的散列。我需要操纵哈希值,以便获得如下结果:

预期输出:

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

如何在这里获得预期的输出?

您可以使用额外的数组 (@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 使订单可预测。

显示的代码一次为每个键使用一个值(对于 A,然后对于 B ...)。相反,assemble 所有键列表中使用 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}};
}