Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

Accessing 2 multidimensional arrays simultaneously

by Ppeoc (Beadle)
on May 04, 2016 at 17:17 UTC ( [id://1162215]=perlquestion: print w/replies, xml ) Need Help??

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

Dear Monks, I have 2 multi dimensional arrays @array1 and @array2. @array1 and @array2 have elements in the form,
$VAR1 = ['1,v,3,4']; $VAR2 = ['3,v,4,t']; ... ... $VARn = ['3,8,0,7']; $VAR1 = ['7,po,0'];
@array1 and @array2 have the same number of rows but different columns. How can I access each row of both the arrays simultaneously. I want to print $VAR1 of @array1 and $VAR1 of @array2 on the same line. display as eg. 1,v,3,4,7,po,0. This is how I have saved my data into @array1
while (<$fh>){ last if /^\s*$/; my @data= split(/\s+/,$_); @data = join (",",@data); push @array1, [@data]; }
This is how I have been accessing elements of 1 2D array
foreach my $x (@array1) { foreach my $y (@$x) { print $fout1 $y,"\n"; } }
Any help would be appreciated. Thanks!

Replies are listed 'Best First'.
Re: Accessing 2 multidimensional arrays simultaneously
by haukex (Archbishop) on May 04, 2016 at 17:50 UTC

    Hi Ppeoc,

    Assuming both arrays have the same number of "rows" (first index) and you know how many "columns" (second index) they have in common, one way is to use indicies, something like this:

    my @a1 = ( ['a','b','c'], ['d','e','f'], ['g','h','i'] ); my @a2 = ( ['j','k','l'], ['m','n','o','p'], ['q','r'] ); for my $r (0..$#a1) { for my $c (0..1) { print "[$r][$c] a1=$a1[$r][$c] a2=$a2[$r][$c]\n"; } } __END__ [0][0] a1=a a2=j [0][1] a1=b a2=k [1][0] a1=d a2=m [1][1] a1=e a2=n [2][0] a1=g a2=q [2][1] a1=h a2=r

    Although I'm wondering a bit about your sample script: You join the array @data into a single element, so your arrays aren't really "multidimensional" if each "row" only has one element. Why not just drop the line @data = join (",",@data);?

    Hope this helps,
    -- Hauke D

      Thanks on your suggestion for dropping the join line to make it truly multidimensional. I am sorry that my question wasn't clear before. I want to display row 1 of the 1st array and then row 1 of the 2nd array. Like this: 'a','b','c','j','k','l'
        #!perl use strict; my @array1 = ( ['a','b','c'], ['d','e','f','g'], ['h','i'] ); my @array2 = ( [1,2,3], [4,5,6,7,8], [9,10] ); my $i = 0; foreach my $ar1 (@array1) { my $ar2 = $array2[$i++]; print join ',', @$ar1,@$ar2; print "\n"; }
        poj

        Hi Ppeoc,

        I see what you mean. If it's always the first row, it's fairly simple: print join(",", @{$a1[0]}, @{$a2[0]}), "\n"; - for an explanation of the dereferencing syntax see perlreftut and maybe perldsc. If you want to do this to all the rows, assuming both arrays have the same number of rows, just add a loop:

        my @a1 = ( ['a','b','c'], ['d','e','f'], ['g','h','i'] ); my @a2 = ( ['j','k','l'], ['m','n','o','p'], ['q','r'] ); for my $r (0..$#a1) { print join(",", @{$a1[$r]}, @{$a2[$r]}), "\n"; } __END__ a,b,c,j,k,l d,e,f,m,n,o,p g,h,i,q,r

        And if you want single quotes around the values: print join(",", map {"'$_'"} @{$a1[0]}, @{$a2[0]}), "\n";

        Hope this helps,
        -- Hauke D

Re: Accessing 2 multidimensional arrays simultaneously
by Marshall (Canon) on May 04, 2016 at 18:14 UTC
    I made a recent post about Arrays of Arrays at Re: Pushing rows of data into array. That shows some examples of to access these things and determine the number of columns. Hope this is of help!
Re: Accessing 2 multidimensional arrays simultaneously
by Anonymous Monk on May 04, 2016 at 19:11 UTC

    Sounds like you could use pairwise:

    my @a1 = ( ['a','b','c'], ['d','e','f'], ['g','h','i'] ); my @a2 = ( ['j','k','l'], ['m','n','o','p'], ['q','r'] ); use List::MoreUtils q(pairwise); use Data::Dumper; my @merged = pairwise {[ @$a, @$b ]} @a1, @a2; print Dumper \@merged;

Re: Accessing 2 multidimensional arrays simultaneously
by Discipulus (Canon) on May 05, 2016 at 07:10 UTC
    Some little variation
    use strict; use warnings; my @arr1 = ( ['a','b','c'], ['d','e','f'], ['g','h','i'] ); my @arr2 = ( ['j','k','l'], ['m','n','o','p'], ['q','r'] ); #1 iterate using map and join print map {(join ',',@{$arr1[$_]},@{$arr2[$_]})."\n"} 0..$#arr1; #2 itarting modifying list separator { # scope to limit the effect of next statement local $"=','; # $LIST_SEPARATOR print map {"@{$arr1[$_]},@{$arr2[$_]}\n"} 0..$#arr1; } #3 or consuming arrays while (my $one = shift @arr1 and my $two = shift @arr2){ print +(join ',',@{$one},@{$two})."\n" }

    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.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://1162215]
Approved by Laurent_R
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others romping around the Monastery: (4)
As of 2024-04-25 23:26 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found