kris1511 has asked for the wisdom of the Perl Monks concerning the following question:

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' Looking for solution without external modules 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; Output ----------- $VAR1 = { 'classification' => [ '0' ], 'location_setting' => [], 'status' => [ '137', '124' ] };

Replies are listed 'Best First'.
Re: Merge 2 array/Hash into 1 variable Perl
by dbander (Scribe) on Aug 03, 2017 at 21:38 UTC

    #!/usr/bin/perl use strict; use warnings; use Data::Dumper; my $h1 = { 'location_setting' => [ '409' ], 'status' => [ '501' ] }; my $h2 = { 'status' => [ '137', '124' ], 'location_setting' => ['405' +], 'classification' => ['0']}; #my $x = {%$h1, %$h2}; my %x = (); my $x = \%x; foreach my $h1key (keys %{$h1}) { push @{$x{$h1key}}, @{${$h1}{$h1key}}; } foreach my $h2key (keys %{$h2}) { push @{$x{$h2key}}, @{${$h2}{$h2key}}; } print Dumper $x;

    Results:

    $VAR1 = { 'status' => [ '501', '137', '124' ], 'location_setting' => [ '409', '405' ], 'classification' => [ '0' ] };

      There's no need to create the %x hash then take a reference to it in $x, just use $x directly. Also, there's no need for the first foreach, just copy $h1 into $x.

      johngg@shiraz:~/perl/Monks > perl -Mstrict -Mwarnings -MData::Dumper - +E ' my $h1 = { location_setting => [ q{409} ], status => [ q{501} ], }; my $h2 = { status => [ qw{ 137 124 } ], location_setting => [ q{405} ], classification => [ q{0} ], }; my $x = { %{ $h1 } }; push @{ $x->{ $_ } }, @{ $h2->{ $_ } } for keys %{ $h2 }; print Data::Dumper->Dumpxs( [ $x ], [ qw{ x } ] );' $x = { 'classification' => [ '0' ], 'status' => [ '501', '137', '124' ], 'location_setting' => [ '409', '405' ] };

      I hope this is of interest.

      Cheers,

      JohnGG

        Thank you, johngg.

        My point was to show that you have to merge the hashes manually (although you can take the shortcut with the first hash, as I see you opted to do); but I should have taken the time to write using the same techniques found in the provided sample.

        Mine was a hurried example; yours not only speaks better to the seeker, but is also a much cleaner presentation.

        Edit:Use of modules or map are probably better solutions, all things considered, but they don't teach the seeker how hashes work. Thus, the "have to" comment above is strictly in the context of doing it "by hand" without those tools.

      Thank you!! works like a charm :)
Re: Merge 2 array/Hash into 1 variable Perl
by kcott (Archbishop) on Aug 04, 2017 at 06:01 UTC

    G'day kris1511,

    Welcome to the Monastery.

    I'm guessing that you'd only want unique values in your final hash (i.e. you wouldn't want something like "status => [124, 124, 137]"). Here's a way to do what you ask and exclude duplicate values.

    #!/usr/bin/env perl use strict; use warnings; use Data::Dump; my $h1 = {locset => [409], status => [501, 137]}; my $h2 = {status => [137, 124], locset => [405, 409], class => [0]}; my %seen = map { $_ => { map { $_ => 1 } @{$h1->{$_}} } } keys %$h1; my $x = $h1; for my $key (keys %$h2) { if (exists $seen{$key}) { push @{$x->{$key}}, grep { ! $seen{$key}{$_} } @{$h2->{$key}}; } else { $x->{$key} = $h2->{$key}; } } dd $x;

    Output:

    { class => [0], locset => [409, 405], status => [501, 137, 124] }

    — Ken

Re: Merge 2 array/Hash into 1 variable Perl
by Your Mother (Archbishop) on Aug 03, 2017 at 22:24 UTC

    Of further interest for non-trivial data structures: Hash::Merge.

Re: Merge 2 array/Hash into 1 variable Perl
by thanos1983 (Parson) on Aug 03, 2017 at 23:00 UTC

    Hello kris1511,

    Welcome to the Monastery. It seems that the Monks already solved your problem in many different ways. Just for the record there is also similar question Merge 2 hashes which contains duplicate Keys including all answers including examples.

    Happy coding, BR.

    Seeking for Perl wisdom...on the process of learning...not there...yet!