onu*_*tas 3 perl pass-by-reference
我试图用数组乘以数组的每个组件,为此,尝试了以下方法;
1-)
@foo = (1, 2, 3, 5, 6);
vectorScalarMultiply(\@foo);
print @foo, "\n";
sub vectorScalarMultiply
{
my $l_vectorRef = $_[0];
for (my $var = 0; $var < scalar(@temp); $var++) {
$l_vectorRef->[$var] = $l_vectorRef->[$var] * 5;
}
}
Run Code Online (Sandbox Code Playgroud)
1的输出;
12356
2-)
@foo = (1, 2, 3, 5, 6);
vectorScalarMultiply(\@foo);
print @foo, "\n";
sub vectorScalarMultiply
{
my $l_vectorRef = $_[0];
map { $l_vectorRef->[$_] * 5 } { $l_vectorRef->[$_] };
}
Run Code Online (Sandbox Code Playgroud)
2的输出;
123456
3-)
@foo = (1, 2, 3, 5, 6);
@temp = @{$l_vectorRef};
vectorScalarMultiply(\@foo);
print @foo, "\n";
$l_vectorRef = map { $temp[$_] * 5; } @temp;
Run Code Online (Sandbox Code Playgroud)
3的输出;
12356
我无法弄清楚问题是什么,为什么它们不起作用,所以我的主要问题是这些代码有什么问题?其次,我们如何解决它?
use strict; use warnings;所以没有注意到@temp未定义所以你的循环长度是0.use strict; use warnings;所以没有注意到map { $l_vectorRef->[$_] * 5 } { $l_vectorRef->[$_] };期望这{ $l_vectorRef->[$_] }是一个列表.您也没有分配map任何地方的结果.use strict; use warnings;所以没有注意到你从未定义过$l_vectorRef(但是如果你这样做了,那么地图会覆盖引用并且不会替换原始数组)第一个不起作用,因为你的循环条件是$var < scalar(@temp),但没有@temp,所以循环永远不会执行.
第二个不起作用,因为map不修改任何东西,并且你没有将结果分配map给任何东西.
第三个不起作用,因为你正在修改$l_vectorRefsub中的变量,而不是修改该变量持有引用的数组.
这是一个更惯用的工作版本:
sub vectorScalarMultiply {
my ($aref) = @_;
$_ *= 5 for @$aref;
}
Run Code Online (Sandbox Code Playgroud)