我真的很想自己弄清楚这一点,但由于不断碰到这堵砖墙,我的脸现在很疼。
我正在尝试加载9个文本文件,每个文本文件由7行7个字符的矩阵组成,这些字符由空格分隔,然后将每个引用的矩阵保存到数组中的元素。我在每个文件中读取都很好,但是当我访问数组时,所有元素都是相同的。我一直在寻找解决方案,或者我的问题在任何地方都没有得到回答,或者(很可能)我不理解答案。这是我的代码的问题部分:
my @boardarray = (1, 2, 3, 4, 5, 6, 7, 8, 9);
sub LoadBoards {
my (@board, $infile, @allboards);
my $i = 1;
@allboards = @boardarray;
foreach (@allboards) {
my $infile = "board" . $i . "\.brd";
open FILE, "< $infile" or die $!;
my $line = 0;
while (<FILE>) {
chomp $_;
my @chars = split (/ /,$_);
$board[$line] = [@chars];
$line++;
}
my $tempboard = \@board;
DisplayOneBoard($tempboard); print ("\n"); #Test A
$boardarray[$i-1] = \@board; #Problem line?
DisplayOneBoard($boardarray[$i-1]); print ("\n"); #Test B
DisplayOneBoard($boardarray[0]); print ("\n----\n"); #Test C
$i++;
}
}
-我尝试将变量作为@boardarray的元素,而没有进行任何更改。
-我在foreach循环中使用了@boardarray,并将其更改为复制的@allboards,没有任何改善。
我希望'Test A'和'Test B'行是相同的,并且'Test C'行将保留我加载的第一个矩阵。但是,对于每次迭代,这三个矩阵都是相同的。
(对于迭代1,它们都是矩阵1。对于迭代2,它们都是矩阵2,依此类推。)
最后,所有元素都是完全相同的矩阵(矩阵9)。
任何援助将不胜感激。谢谢。
最佳答案
问题是您每次在循环中都重复使用相同的@board
。当您将对该板的引用推送到@boardarray
时,您每次都将引用指向相同@board
的引用。解决方法很简单,只需将my @board
移动到foreach
循环的内部即可;这每次都会创建一个新的@board
。
关于arrays - Perl:在Foreach循环中分配对数组元素的引用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5996140/