1

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;
2
  • Union even if that creates duplicate values? Commented Aug 3, 2017 at 19:19
  • I think ideally not duplicated, it won't matter to the SQL creation status in (501, 501) will list same results Commented Aug 3, 2017 at 19:22

2 Answers 2

2
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;
Sign up to request clarification or add additional context in comments.

Comments

1
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;

5 Comments

Why are you using Data::Dumper if you're (stupidly) against external libraries?
Would have been nice to credit the person from which you copied this.
still learning perl, sr folks don't want to import any library ... not my call
So why did you (Data::Dumper, and hopefully strict and warnings)?
I think that you must quote sources if you copy a substantial portion of it. This one's copy-pasted. I suggest that you edit your post and add a link to where it's taken from.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.