为什么引用数组的值没有改变?
Why are the referenced array's values not changed?
我正在尝试将数组的每个分量与一个标量相乘,为此,尝试了以下操作;
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;
}
}
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->[$_] };
}
2 的输出;
123456
3-)
@foo = (1, 2, 3, 5, 6);
@temp = @{$l_vectorRef};
vectorScalarMultiply(\@foo);
print @foo, "\n";
$l_vectorRef = map { $temp[$_] * 5; } @temp;
3 的输出;
12356
而且我一直无法弄清楚问题是什么,为什么它们不起作用,所以我的 main 问题是这些代码有什么问题?其次,如何解决?
- 因为你忘记了
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
的结果分配给任何东西。
第三个不起作用,因为您正在修改 sub 中的变量 $l_vectorRef
,而 而不是 修改该变量引用的数组.
这里是一个更惯用的工作版本:
sub vectorScalarMultiply {
my ($aref) = @_;
$_ *= 5 for @$aref;
}
我正在尝试将数组的每个分量与一个标量相乘,为此,尝试了以下操作;
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;
}
}
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->[$_] };
}
2 的输出;
123456
3-)
@foo = (1, 2, 3, 5, 6);
@temp = @{$l_vectorRef};
vectorScalarMultiply(\@foo);
print @foo, "\n";
$l_vectorRef = map { $temp[$_] * 5; } @temp;
3 的输出;
12356
而且我一直无法弄清楚问题是什么,为什么它们不起作用,所以我的 main 问题是这些代码有什么问题?其次,如何解决?
- 因为你忘记了
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
的结果分配给任何东西。
第三个不起作用,因为您正在修改 sub 中的变量 $l_vectorRef
,而 而不是 修改该变量引用的数组.
这里是一个更惯用的工作版本:
sub vectorScalarMultiply {
my ($aref) = @_;
$_ *= 5 for @$aref;
}