我真的很想自己弄清楚这一点,但由于不断碰到这堵砖墙,我的脸现在很疼。

我正在尝试加载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/

10-11 22:59
查看更多