首页 文章

Perl:在Foreach循环中为数组元素分配引用

提问于
浏览
5

我真的很想弄明白这一点,但是我的脸因为不断撞到这堵砖墙而受到伤害 .

我正在尝试加载9个文本文件,每个文件由7行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) .

任何援助将不胜感激 . 谢谢 .

2 回答

  • 4

    问题是你每次循环都重复使用相同的 @board . 当您将对该板的引用推送到 @boardarray 时,您每次都按下指向相同 @board 的引用 . 修复很简单,只需将 my @board 移动到 foreach 循环的内部;每次创建一个新的 @board .

  • 8

    您可以通过更多地分解代码并使用数组作为带有push / pop的堆栈来获得更好的运气:

    sub load_file {
        my ($filename) = @_;
        open my $file, '<', $filename or die $!;
        my @array;
        while (<$file>) {
            chomp $_;
            my @chars = split (/ /,$_);
            push @array, \@chars;    ### adds a reference to the char line 
                                     ### array to the end of the array
        }
        return \@array;              ### return a ref to the 2-d array
    }
    
    sub load_files {
        my ($num) = @_;
        my %boards;     ### A hash, so we can refer to loaded arrays
                        ### with a string ID
    
        for my $filenum ( 1 .. $num ) {
             my $filename = "board" . $filenum . "\.brd";
             $boards{$filenum} = load_file($filename);
        }
    
        return \%boards;   ### return a ref to the hash of 2-d arrayrefs
    }
    
    ### use it now...
    my $boards = load_files(9); ### load 9 files.
    
    DisplayOneBoard($boards->{6}); ### dereference our hashref, pass board in
                                   ### key '6'to be displayed
    

相关问题