I'm a Perl beginner having trouble with arrays of arrays. When I define an AoA
using a named AoA, both array names seem to refer to the same AoA. For example, if I first define @aoa1 with an anonymous AoA and then define @aoa2 with "
my @aoa2 = @aoa1;", the modification of @aoa2 undesirably modifies @aoa1 (and vice versa).
The script below demonstrates this problem:
use strict;
use warnings;
my @aoa1 = ( # define @aoa1 w/ anonymous AoA
["-","-","-"],
["-","-","-"],
["-","-","-"],
);
# my @aoa2 = ( # define @aoa2 w/ anonymous AoA
# ["-","-","-"],
# ["-","-","-"],
# ["-","-","-"],
# );
my @aoa2 = @aoa1; # define @aoa2 w/ named AoA
# $aoa1[1][1] = '@'; # modify @aoa1
$aoa2[1][1] = '@'; # modify @aoa2
printAoa( "aoa1", @aoa1 ); # print @aoa1
printAoa( "aoa2", @aoa2 ); # print @aoa2
exit;
sub printAoa {
my ( $aoaName, @aoa ) = @_;
my $row;
my $col;
print "*** $aoaName ***\n";
for $row ( 0 .. 2 ) {
for $col ( 0 .. 2 ) {
print "$aoa[$row][$col] ";
}
print "\n";
}
print "\n";
}
I would expect the above script to print:
*** @aoa1 ***
- - -
- - -
- - -
*** @aoa2 ***
- - -
- @ -
- - -
Instead, I get:
*** @aoa1 ***
- - -
- @ -
- - -
*** @aoa2 ***
- - -
- @ -
- - -
It's as if @aoa1 and @aoa2 refer to the same AoA. When "
$aoa2[1][1] = '@';" is commented out and "
$aoa1[1][1] = '@';" is activated, the output is the same.
The only way I can get @aoa1 and @aoa2 to behave as I'd like is to define both of them with anonymous AoA's. If you comment out "
my @aoa2 = @aoa1;" and uncomment the lines above it, the script produces the desired output. This is all well and good, but in my actual script, I need to define AoA's from named AoA's rather than anonymous ones.
Any suggestions would be greatly appreciated.
Thanks,
Andrew
Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
Read Where should I post X? if you're not absolutely sure you're posting in the right place.
Please read these before you post! —
Posts may use any of the Perl Monks Approved HTML tags:
- a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
Outside of code tags, you may need to use entities for some characters:
| |
For: |
|
Use: |
| & | | & |
| < | | < |
| > | | > |
| [ | | [ |
| ] | | ] |
Link using PerlMonks shortcuts! What shortcuts can I use for linking?
See Writeup Formatting Tips and other pages linked from there for more info.