Kris1511
Kris1511

Reputation: 300

Merge 2 array/Hash into 1 variable Perl

I have 2 variables that are returned on form submission. I need to merge the values into 1 Variable that I can use to create SQL later on.
How can I get results that is union of all the values: i.e. location_setting = '409','405' and Status = '501', '137', '124'

Here is my current code, but spits only values from h2

use Data::Dumper;

my $h1 =  {  'location_setting' => [ '409' ], 'status' => [ '501' ] };

my $h2 = {  'status' => [ '137', '124' ], 'location_setting' => ['405'], 'classification' => ['0']}; 

my $x = {%$h1, %$h2};

print Dumper $x;

Upvotes: 1

Views: 72

Answers (2)

Kris1511
Kris1511

Reputation: 300

use Data::Dumper;
use List::Util qw( uniq );

my $h1 =  {  'location_setting' => [ '409' ], 'status' => [ '501' ] };

my $h2 = {  'status' => [ '137', '124' ], 'location_setting' => [], 'classification' => ['0']}; 

my %x;
foreach my $h1key (keys %{$h1}) {
    push @{$x{$h1key}}, @{${$h1}{$h1key}};
}

foreach my $h2key (keys %{$h2}) {
    push @{$x{$h2key}}, @{${$h2}{$h2key}};
}

@$_ = uniq @$_
   for values(%x);

my $x = \%x;
print Dumper $x;

Upvotes: 1

ikegami
ikegami

Reputation: 386561

use List::Util qw( uniq );

my %h =
   map {
      $_ => [
         uniq
            $h1->{$_} ? @{ $h1->{$_} } : (),
            $h2->{$_} ? @{ $h2->{$_} } : (),
      ]
   } 
      uniq
         keys(%$h1), keys(%$h2);

If you have lots of hashes or a variable number of hashes,

use List::Util qw( uniq );

my @hashes = ( $h1, $h2, ... );

my %h =
   map {
      my $key = $_;
      $key => [ uniq map @$_, grep $_, map $_->{$key}, @hashes ]
   } 
      uniq map keys(%$_), @hashes;

Upvotes: 2

Related Questions