【发布时间】:2019-11-12 16:03:47
【问题描述】:
为三个元素数组创建一个产品矩阵。我知道 Perl 没有多维数组并且是扁平的。我一直在使用 refs,但我似乎无法解决 for 循环问题,将三个产品放入一个数组并将该数组推入另一个数组。我也可能会走得很远。很好,但我在这上面花了太多时间。
我已经将值移入和移出各个位置,即 { },打印出变量直到我变蓝并使用 $last 进行调试。我可能在这一点上被炒了。
use strict;
use warnings;
my @array1 = (1, 2, 3);
my @array2 = (2, 4, 6);
my @matrixArray = ();
my $matrixArray;
my @row;
my @finalArray = maths(\@array1, \@array2);
print @finalArray;
sub maths{
my $array1ref = shift;
my $array2ref = shift;
my $value1;
my $value2;
my $maths;
my @row = ();
my @array1 = @{$array1ref};
my @array2 = @{$array2ref};
my $len1 = @array1;
my $len2 = @array2;
for my $x (0 ..($len1 -1)){
#iterate through first array at each value
$value1 = $array1[$x];
#print $value1, " value1 \n";
for my $y (0 .. ($len2 -1)){
#iterate through second array at each value
$value2 = $array2[$y];
#print $value2, " value2 \n";
#calculate new values
$maths = $value1 * $value2;
#exactly right here
#print $maths, " maths \n" ;
push @row, $maths;
}
}
#and exactly right here but not set of arrays
#print @row, "\n";
return @row;
}
目前我可以得到这个:246481261218。这是正确的愚蠢数学但是......
它应该显示为一个矩阵:
2 4 6 4 8 12 6 12 18我没有传递三个数组,所以我的问题似乎出在子例程中,然后我才能继续处理其他任何事情。这似乎是我经常怀念的一个主题。很抱歉,如果我听起来无能。
编辑*** 这是有效的,但我无法打开它
use strict;
use warnings;
my @array1 = (1, 2, 3);
my @array2 = (2, 4, 6);
my @matrixArray = ();
maths(\@array1, \@array2);
foreach my $x (@matrixArray){
print "$x \n";
}
sub maths{
my $array1ref = shift;
my $array2ref = shift;
my $value1;
my $value2;
my $maths;
my @row = ();
my $row;
my @array1 = @{$array1ref};
my @array2 = @{$array2ref};
my $len1 = @array1;
my $len2 = @array2;
for my $x (0 ..($len1 -1)){
#iterate through first array at each value
$value1 = $array1[$x];
for my $y (0 .. ($len2 -1)){
#iterate through second array at each value
$value2 = $array2[$y];
#calculate new values
$maths = $value1 * $value2;
push @row, $maths;
$row = \@row;
}
push @matrixArray, $row;
}
return @matrixArray;
}
函数调用后的输出是这样的:
数组(0x55bbe2c667b0) 数组(0x55bbe2c667b0) 数组(0x55bbe2c667b0)这将是 $x 的(第 10 行)打印。
****编辑 这工作(几乎):
print join(" ", @{$_}), "\n" for @matrixArray;
输出有点不对……
2 4 6 4 8 12 6 12 18
2 4 6 4 8 12 6 12 18
2 4 6 4 8 12 6 12 18
值得注意的是:我知道 $x 是一个数组,但我似乎在尝试正确解压缩它时遇到了麻烦。而且我不再是 Perl 的粉丝了。我渴望 Python 的峡湾。
和 ***** 编辑 这很好用,我从中得到了三个数组:
sub maths{
my ($array1, $array2) = @_;
my @res;
for my $x (@$array1) {
my @row;
for my $y (@$array2) {
push @row, $x * $y;
}
push @res, \@row;
}
#This is the correct structure on print @res!
return @res;
}
但是,虽然它正确地组合在一起,但调用后我没有输出
maths(\@array1, \@array2);
这里什么都没有……
print @res;
print join(" ", @{$_}), "\n" for @res;
foreach my $x (@res){
print join(" ", @{$x}), "\n";
}
当然还有一百万谢谢!我后悔上了这门愚蠢的课程,并担心我的成绩最终会影响我。仍然渴望 Python!
【问题讨论】:
-
我已经格式化了你的矩阵,请检查它们是否正确。
-
是的,更好看
-
检查
my @row = ()在我的答案中出现的位置。它需要在 x 循环内 - 每次迭代都需要一个单独的变量 -
您最近对
maths的实现返回了一个数组,但您没有保存它(例如my @matrixArray = maths(\@array1, \@array2);)。您之前的实现将全局变量更新为副作用(这可能最好避免)。 -
天哪!非常感谢!
标签: arrays perl for-loop nested