你遇到的简单问题。完成打印一行后,您需要打印一个 NL。但是,当我引起你的注意时,我会继续闲聊。
您应该使用references将数据存储在矩阵中。这样,您存储数据的方式与数据的概念相匹配:
my @atoms; # Storing the data in here
my $i = 300;
my $j = 400;
my $value = ...; # Calculating what the value should be at column 300, row 400.
# Any one of these will work. Pick one:
my $atoms[$i][$j] = $value; # Looks just like a matrix!
my $atoms[$i]->[$j] = $value; # Reminds you this isn't really a matrix.
my ${$atoms[$1]}[$j] = $value; # Now this just looks ridiculous, but is technically correct.
我的偏好是第二种方式。这只是一个轻微的提醒,这实际上不是一个矩阵。相反,它是我的行数组,每一行都指向另一个数组,该数组保存该特定行的列数据。尽管不如第一种方式那么干净,但语法仍然很干净。
现在,让我们回到您的问题:
my @atoms; # I'll store the calculated values here
....
my $atoms[$i]->[$j] = ... # calculated value for row $i column $j
....
# And not to print out my matrix
for my $i (0..$#atoms) {
for my $j (0..$#{ $atoms[$i] } ) {
printf "%4.2f ", $atoms[$i]->[$j]; # Notice no "\n".
}
print "\n"; # Print the NL once you finish a row
}
注意我使用for my $i (0..$#atoms)
. 这种语法比for
不鼓励使用的 C 风格的三部分更干净。(Python 没有,我不知道 Perl 6 会支持它)。这很容易理解:我正在增加我的数组。我还使用$#atom
which 是我的@atoms
数组的长度——或者我的矩阵中的行数。这样,随着矩阵大小的变化,我不必编辑我的程序。
列有点诡计。 是对包含我的 row 列数据的数组的引用,并不真正直接代表一行数据。(这就是为什么我喜欢而不是。它给了我这个微妙的提醒。)要获取包含我的列数据的实际数组 row ,我需要取消引用它。因此,实际列值存储在数组 array的行中。[$j]
$atom[$i]
$i
$atoms[$i]->[$j]
$atoms[$i][$j]
$i
$i
@{$atoms[$i]}
要获取数组中的最后一个条目,请将@
sigil替换为 ,因此我的
数组中$#
的最后一个索引是。
$#{ $atoms[$i] }
哦,另一件事,因为这不是一个真正的矩阵:每一行可能有不同数量的条目。你不能用真正的矩阵来做到这一点。这使得在 Perl 中使用 Array of Arrays 更加强大,也更加危险。如果您需要一致的列数,则必须手动检查。真正的矩阵会根据最大值自动创建所需的列$j
。