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!
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 | [reply] [d/l] [select] |
|
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'
| [reply] |
|
#!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 | [reply] [d/l] |
|
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 | [reply] [d/l] [select] |
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! | [reply] |
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;
| [reply] [d/l] [select] |
Re: Accessing 2 multidimensional arrays simultaneously
by Discipulus (Canon) on May 05, 2016 at 07:10 UTC
|
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.
| [reply] [d/l] |
|
|