Perl 替换值而不更新数组

Jer*_*eld 3 perl lexical-scope

我有以下 Perl 脚本。

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

my @fruits = qw(apple banana orange pear);

print Dumper \@fruits;

foreach my $fruit (@fruits) {
  $fruit =~ s|apple|peach|;
}

print Dumper \@fruits;
Run Code Online (Sandbox Code Playgroud)

返回以下内容。

$VAR1 = [
          'apple',
          'banana',
          'orange',
          'pear'
        ];
$VAR1 = [
          'peach',
          'banana',
          'orange',
          'pear'
        ];
Run Code Online (Sandbox Code Playgroud)

我不明白为什么以下行将 @fruits 数组中的 apple 更改为 peach,因为我认为此行仅适用于 $fruit 变量,而不适用于 @fruits 数组。

$fruit =~ s|apple|peach|;
Run Code Online (Sandbox Code Playgroud)

Don*_*nat 5

在 perl 的 html 文档中,我们对 foreach 循环有以下语句:

foreach 循环索引变量是您要循环的列表中每个项目的隐式别名

这意味着,您不会获得每个数组元素的副本。该变量$fruit只是对数组元素的引用。如果可以修改数组元素,则可以修改其值。修改适用于原始数组元素。

  • 你可以使用`/r`正则表达式修饰符一次性完成,例如`my $inner = $fruit =~ s|apple|peach|gr;`(虽然我发现`s{apple}{peach}gr`个人更易读的方式)) (2认同)