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

Hi, I have 2 array's: @array1(red,blue,green); @array2(black,orange,white); Is there any chance i can put in a hash like this %hash={red:black,blue:orange,green:white}: ? I'm not looking for a fat comma (e.g. red=>black) format as this hash is passed onto a method which requires values exactly to be in this format red:black,blue:orange,green:white for the command to succeed. Thanks in advance

Replies are listed 'Best First'.
Re: Getting the hash in this format
by Athanasius (Archbishop) on Aug 23, 2014 at 11:55 UTC

    Hello ash_86, and welcome to the Monastery!

    You can use the pairwise function from List::MoreUtils:

    #! perl use strict; use warnings; use List::MoreUtils 'pairwise'; use Data::Dump; my @array1 = qw(red blue green); my @array2 = qw(black orange white); my %hash = pairwise { $a => $b } @array1, @array2; dd \%hash;

    Output:

    21:57 >perl 977_SoPW.pl { blue => "orange", green => "white", red => "black" } 21:57 >

    Hope that helps,

    Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

      Thanks Athanasius for looking into this. But the problem is that i will pass on %hash to a function which executes a unix commands based on these parameter. So unix command will as such look like ...-colorPair blue => orange, green => white, red => black and it will fail. I want it like -colorPair blue:orange,green:white,red:black Is this possible?

        Sure, but then you might be better off with another array, rather than a hash as the node title requested:

        #! perl use strict; use warnings; my @array1 = qw(red blue green); my @array2 = qw(black orange white); my @params; push @params, shift(@array1) . ':' . shift(@array2) while @array1; print join(',', @params), "\n";

        Output:

        22:16 >perl 977_SoPW.pl red:black,blue:orange,green:white 22:20 >

        Update: The above removes the elements from @array1 and @array2. For a non-destructive solution, we can again use pairwise:

        #! perl use strict; use warnings; use List::MoreUtils 'pairwise'; use Data::Dump; my @array1 = qw(red blue green); my @array2 = qw(black orange white); my @params = pairwise { $a . ':' . $b } @array1, @array2; dd \@array1; dd \@array2; print join(',', @params), "\n";

        Output:

        23:51 >perl 977_SoPW.pl ["red", "blue", "green"] ["black", "orange", "white"] red:black,blue:orange,green:white 23:51 >

        Hope that helps,

        Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

Re: Getting the hash in this format
by AnomalousMonk (Archbishop) on Aug 23, 2014 at 17:16 UTC

    The string (if it is a string) that you want seems to be in a format very similar to JSON (see also JSON on Wikipedia). You may even be able to parameterize the JSON methods to eliminate the characters you don't (seem) to need, the curlies and double-quotes, without needing a separate  tr/// step. Using a module like JSON means that you have immediate support if and when you need to deal with a more complex structure.

    c:\@Work\Perl>perl -wMstrict -le "use JSON; use List::MoreUtils qw(zip); ;; use Data::Dump; ;; my @array1 = qw(red blue green); my @array2 = qw(black orange white); my $hashref = { zip @array1, @array2 }; dd $hashref; ;; my $j_str = encode_json $hashref; print qq{fresh: '$j_str'}; ;; $j_str =~ tr/{}\"//d; print qq{stripped: '$j_str'}; " { blue => "orange", green => "white", red => "black" } fresh: '{"green":"white","blue":"orange","red":"black"}' stripped: 'green:white,blue:orange,red:black'

      When I see someone asking questions about how to piece together a data representation that looks almost like JSON, I start wondering if perhaps this person actually does want JSON and just doesn't realize that's what it's called.

      This happened recently when someone was asking how to decode a string that looked almost like JSON. Turned out it started out as JSON but in his attempt to mold it into a Perlish structure, he had stripped away parts of the JSON syntax/punctuation. So the question may have been about how to turn Y (his format) into Z (Perl), but the actual problem he was taking on was how to turn X (json) into Z (Perl data structure).


      Dave

        ... how to decode a string that looked almost like JSON ... it started out as JSON ... had stripped away parts of the JSON syntax ...

        IOW, perhaps a classic XY Problem, or in this case maybe a JXP Problem!

Re: Getting the hash in this format
by Laurent_R (Canon) on Aug 23, 2014 at 16:15 UTC
    So you don't really want a hash, but rather a string. You might try something based on this Perl debugger session:
    DB<1> @a1 = (red,blue,green); DB<2> @a2 = (black,orange,white); DB<3> print join ',', map {"$a1[$_]:$a2[$_]"} 0..2; red:black,blue:orange,green:white