【问题标题】:Perl replace value without updating arrayPerl替换值而不更新数组
【发布时间】:2021-07-30 11:26:03
【问题描述】:

我有以下 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;

返回以下内容。

$VAR1 = [
          'apple',
          'banana',
          'orange',
          'pear'
        ];
$VAR1 = [
          'peach',
          'banana',
          'orange',
          'pear'
        ];

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

$fruit =~ s|apple|peach|;

【问题讨论】:

    标签: perl lexical-scope


    【解决方案1】:

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

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

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

    【讨论】:

    • 明白了,现在说得通了。在foreach 循环中,我将定义my $inner = $fruit;,然后将修改应用到$inner 变量$inner =~ s|apple|peach|g;。非常感谢这里的帮助!
    • 您可以使用/r 正则表达式修饰符一次性完成,例如my $inner = $fruit =~ s|apple|peach|gr;(虽然我个人觉得s{apple}{peach}gr 更易读))
    • 如果你确实得到了一份副本,那么代码将不会做任何事情
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-07
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    • 2018-06-21
    相关资源
    最近更新 更多