【问题标题】:perl 'last' statement and variable scopeperl 'last' 语句和变量范围
【发布时间】:2019-02-27 05:01:47
【问题描述】:

应该是简单的 Perl 构造并没有像我预期的那样运行。

@closest 数组包含“NNN-NNN”形式的字符串。我试图找到初始“NNN”与特定值匹配的第一个数组元素。

由于我在循环外声明了$compoundKey,我希望它是持久的。循环按预期运行,当我得到匹配时退出。但是,代码退出循环后,$compoundKey 变量为空。 (查看代码后的日志输出。我正在寻找“83”。匹配的元素不是数组中的最后一个元素。)

    my $compoundKey;
    foreach $compoundKey (@closest)
    {
        logentry("In loop compoundKey is $compoundKey\n");
        last if ($compoundKey =~ /^$RID/);   
    }
    logentry("Outside loop compoundKey is $compoundKey\n");

日志文件:

    2019-02-27 18:15:26: In loop compoundKey is 90-1287
    2019-02-27 18:15:26: In loop compoundKey is 86-1223
    2019-02-27 18:15:26: In loop compoundKey is 86-1235
    2019-02-27 18:15:26: In loop compoundKey is 87-1316
    2019-02-27 18:15:26: In loop compoundKey is 89-1219
    2019-02-27 18:15:26: In loop compoundKey is 83-1224
    2019-02-27 18:15:26: Outside loop compoundKey is 

我假设我可以通过将临时循环变量显式分配给$compoundKey 来解决此问题,但我仍然有些迷惑。我的代码中是否有一些我没有看到的错误?还是 Perl 中的“last”语句的行为方式与 C 或 Java 中的“break”完全不同?

谢谢!

【问题讨论】:

  • 当然我用的是“严格”。
  • 另见List::MoreUtils 及其search 方法的全部范围,例如firstvalfirstidx

标签: perl loops break


【解决方案1】:

这不是last 声明,it's the foreach statement

foreach 循环遍历一个普通的列表值,并将标量变量 VAR 依次设置为列表的每个元素。如果变量以关键字 my 开头,则它是词法范围的,因此仅在循环中可见。 否则,该变量隐含地是循环的局部变量,并在退出循环时恢复其以前的值。 如果该变量先前使用 my 声明,它将使用该变量而不是全局变量,但它仍然是本地化的到循环。这种隐式本地化仅发生在 foreach 循环中。 (强调)。

【讨论】:

  • 看似违反直觉,但我不会再犯这个错误了!
  • 避免此问题的最简单方法是始终使用循环词法迭代器 (foreach my $foo)。如果要保存值,请单独分配给外部声明的变量。
猜你喜欢
  • 1970-01-01
  • 2015-10-24
  • 2020-11-09
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多