为什么引用数组的值没有改变?

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 问题是这些代码有什么问题?其次,如何解决?

  1. 因为你忘记了 use strict; use warnings; 所以没有注意到 @temp 是未定义的所以你的循环长度是 0.
  2. 因为您忘记了 use strict; use warnings; 所以没有注意到 map { $l_vectorRef->[$_] * 5 } { $l_vectorRef->[$_] }; 期望 { $l_vectorRef->[$_] } 是一个列表。您也没有在任何地方分配 map 的结果。
  3. 因为您忘记了 use strict; use warnings; 所以没有注意到您从未定义 $l_vectorRef(但如果您定义了,那么地图将 覆盖引用 而不是替换原来的数组)

第一个不起作用,因为你的循环条件是$var < scalar(@temp),但是没有@temp,所以循环永远不会执行。

第二个不起作用,因为 map 没有修改任何东西,而且您没有将 map 的结果分配给任何东西。

第三个不起作用,因为您正在修改 sub 中的变量 $l_vectorRef,而 而不是 修改该变量引用的数组.

这里是一个更惯用的工作版本:

sub vectorScalarMultiply {
    my ($aref) = @_;
    $_ *= 5 for @$aref;
}