选择返回数组引用而不是返回数组,通常归结为大小。
如果您要传输小数组,我会写它:
return @translatematrix;
如果您正在传输大型数组(大到足以影响性能),那么我可能会考虑返回一个引用。
我不确定您是否应该称它们为矩阵,因为它们似乎是笛卡尔坐标数组。这会更容易思考。
无论如何,您的代码非常冗长,而且很可能是错误的。
它在不需要时使用 C 风格的循环。
foreach
循环通常更快,并且它们更明确地说明它们循环的内容。
它在内部数组上循环,即使您几乎总是会更改其中的 3 个值。
您的内部 for 循环使用外部数组的长度,而不是内部数组的长度。
如果外循环的元素少于 3 个,这是一个问题。
这也意味着当您的外部数组很大时,您的代码会花费大量时间什么都不做。
这也是使用foreach
循环的另一个原因,你不能把它的测试部分弄错。
您修改原始数组的元素。
您返回对您在子例程中实际未使用的数组的引用。
我只能假设您的代码中没有use strict;
and use warnings;
,或者您@translatematrix
在代码中的其他地方声明了。
这是一个仍然修改原始数组的版本。(也许这就是你真正想要的)
use strict;
use warnings;
my @matrix = ...;
# no need for a temporary variable
my ($x,$y,$z) = calculateCenterMass(@matrix);
print "Center of Mass for Matrix Above\n";
printf( "X:%.3f,Y:%.3f,Z:%.3f\n\n", $x, $y, $z );
# it returns a reference, not an array.
my $tempMatrix = translateMatrixOperation( $x, $y, $z, \@matrix );
sub translateMatrixOperation {
my ($x, $y, $z, $translate_matrix) = @_;
for my $xyz ( @$translate_matrix ){
$xyz->[0] -= $x;
$xyz->[1] -= $y;
$xyz->[2] -= $z;
}
return @$translate_matrix if wantarray;
return $translate_matrix;
}
这是一个创建新数组的版本。
my $tempMatrix = translateMatrixOperation( $x, $y, $z, @matrix );
sub translateMatrixOperation {
my ($x, $y, $z, @coord) = @_;
# This is here in case you give it an array reference like you did before.
# It is quite fragile, you should remove it if you don't need it.
if( 1
and @coord == 1
and ref( my $aref = $coord[0] ) eq 'ARRAY'
and ref($aref->[0]) eq 'ARRAY'
){
@coord = @$aref;
}
# create a new list
my @return = map{
# of a new array refs based on the old ones
[ $_->[0] - $x, $_->[1] - $y, $_->[2] - $z, @$_[3..$#$_] ]
# the @$_[3..$#$_] part may be unnecessary
# it should be removed if that is the case
} @coord;
return @return if wantarray;
return \@return;
}
如果您删除我认为您不需要的部分,它会变得很短
my $tempMatrix = translateMatrixOperation( $x, $y, $z, @matrix );
sub translateMatrixOperation {
my ($x, $y, $z, @coords) = @_;
my @return = map{
[ $_->[0] - $x, $_->[1] - $y, $_->[2] - $z ]
} @coords;
return @return if wantarray;
return \@return;
}
您还应该为它找出一个更好的名称,translateMatrixOperation
不是很具描述性。