我真的很想弄明白这一点,但是我的脸因为不断撞到这堵砖墙而受到伤害。
我正在尝试加载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而没有任何改进
我希望'测试A'和'测试B'线是相同的,并且'测试C'线保持我加载的第一个矩阵。但是,所有三个都是相同的每次迭代。
(对于迭代1,它们都是矩阵1.对于迭代2,它们都是矩阵2,等等。)
最后,所有元素都是完全相同的矩阵(矩阵9)。
任何帮助将不胜感激。感谢。
答案 0 :(得分:8)
问题在于,每次循环都会重复使用相同的 @board
。当您将该板的引用推送到@boardarray
时,您每次都会推送指向相同@board
的引用。修复很简单,只需将my @board
移到foreach
循环的内部即可;每次创建一个新的@board
。
答案 1 :(得分:4)
你可以通过更多地分解代码并使用数组作为带有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