【问题标题】:Is there a way to modify foreach loop variable?有没有办法修改 foreach 循环变量?
【发布时间】:2010-12-01 21:50:18
【问题描述】:

以下代码给出错误信息:

#!/usr/bin/perl -w

foreach my $var (0, 1, 2){
    $var += 2;
    print "$var\n";
}

Modification of a read-only value attempted at test.pl line 4.

有没有办法修改$var? (我只是出于好奇而问;看到这个错误消息,我其实很惊讶。)

【问题讨论】:

  • 您为什么要想要修改循环变量?这听起来像是一种使循环行为不可预测的方法。 但也许这就是你想要的?
  • 它不会使循环行为不可预测,因为它不会干扰迭代器。结果可能出乎意料,但完全可以预料。
  • +1 出于好奇和理解错误消息的愿望,即使您已经找到了解决方法:-)。

标签: perl variables loops foreach readonly


【解决方案1】:

foreach $var (@list) 构造中,$var 成为循环元素的别名,即$var 的内存地址与@list 的元素地址相同。因此,您的示例代码尝试修改只读值,您会收到错误消息。

这个小脚本将演示 foreach 构造中发生的事情:

my @a = (0,1,2);
print "Before: @a\n";
foreach my $var (@a) {
  $var += 2;
}
print "After:  @a\n";

Before: 0 1 2
After:  2 3 4

其他信息:来自perlsynThis item 很容易掩饰,但提供了整个独家新闻:

Foreach 循环

...

如果 LIST 的任何元素是左值, 你可以通过修改VAR来修改它 循环内。反之,如有 LIST 的元素不是左值,任何 尝试修改该元素将 失败。换句话说,“foreach” 循环索引变量是隐式的 列表中每个项目的别名 你在循环。

【讨论】:

    【解决方案2】:

    Perl 抱怨的是常量值,而不是循环变量。它抱怨的只读值是您的0,因为$var 是它的别名,并且它没有存储在变量中(这是您可以更改的)。如果你遍历一个数组或一个变量列表,你就不会有这个问题。

    【讨论】:

      【解决方案3】:

      弄清楚为什么以下内容不会导致相同的消息将大大有助于提高您对为什么首先发出消息的理解:

      #!/usr/bin/perl
      
      use strict;
      use warnings;
      
      for my $x ( @{[ 0, 1, 2 ]} ) {
          $x += 2;
          print $x, "\n";
      }
      

      【讨论】:

        猜你喜欢
        • 2020-02-13
        • 1970-01-01
        • 2023-03-04
        • 2016-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-02
        • 1970-01-01
        相关资源
        最近更新 更多