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

Hello Monks, I am beginner in perl. I am facing issue with storing multidimensional arrays as key value pairs. I have 3 arrays. Array1 is a key of Array2 and Array2 should be key for Array3. Can anyone help me with this? With my code below array1 has keys for array2 and is stored as key value pair. How can I do it for 3 arrays?

#!usr/bin/perl use Data::Dumper; my @array1 = 'A' .. 'E'; my @array2 = 1 .. 5; my @array3 = 'a' .. 'e'; my %hash; @hash{@array1} = @array2; print Dumper \%hash; ~

Replies are listed 'Best First'.
Re: Hashes of Hashes with Multidimensional array
by choroba (Cardinal) on Dec 15, 2016 at 12:07 UTC
    You didn't specify what output structure you expect. One key in each inner hash? You can use map for that, there's no direct syntactic way to create such a structure (maybe because it's not so common?)

    #!/usr/bin/perl use warnings; use strict; use Data::Dumper; my @array1 = 'A' .. 'E'; my @array2 = 1 .. 5; my @array3 = 'a' .. 'e'; my (%hash, %tmp); @tmp{@array2} = @array3; @hash{@array1} = map +{ $_ => $tmp{$_} }, @array2; print Dumper \%hash;

    Output:

    $VAR1 = { 'A' => { '1' => 'a' }, 'D' => { '4' => 'd' }, 'E' => { '5' => 'e' }, 'C' => { '3' => 'c' }, 'B' => { '2' => 'b' } };

    You can also use a for loop:

    my %hash2; for my $i (0 .. $#array1) { $hash2{ $array1[$i] }{ $array2[$i] } = $array3[$i]; }
    ($q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord }map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+$1,++print+eval$q,q,a,
      Thank you so much Choroba for help.
        Thank you so much Eshan_k for reply to Choroba.
Re: Hashes of Hashes with Multidimensional array
by Discipulus (Canon) on Dec 15, 2016 at 12:44 UTC
    ..or consuming each array while is defined the first one:

    # warning windows doublequotes! # Data::Dump is a bit better.. perl -MData::Dump -e "@ar1='A'..'E';@ar2=1..5;@ar3='a'..'e';$hash{shif +t @ar1}={shift @ar2=>shift @ar3} while @ar1; dd %hash" ( "A", { 1 => "a" }, "D", { 4 => "d" }, "C", { 3 => "c" }, "E", { 5 => "e" }, "B", { 2 => "b" }, )

    ..or, just to learning something, mixing the whole into a single assignement forcing map to return an anonymous hash {$_=>"something"}

    perl -MData::Dumper -e "@ar1='A'..'E';@ar2=1..5;@ar3='a'..'e';@hash{@a +r1}=map{{$_=>shift @ar3}}@ar2;print Dumper \%hash" $VAR1 = { 'A' => { '1' => 'a' }, 'D' => { '4' => 'd' }, 'C' => { '3' => 'c' }, 'E' => { '5' => 'e' }, 'B' => { '2' => 'b' } };

    L*

    There are no rules, there are no thumbs..
    Reinvent the wheel, then learn The Wheel; may be one day you reinvent one of THE WHEELS.
      Thank you so much Discipulus for your help.
        Thank you so much Eshan_k for your reply Discipulus.