perl的“ last”语句和变量范围

时间:2019-02-27 05:01:47

标签: perl loops break

应该是简单的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”行为完全不同?

谢谢!

1 个答案:

答案 0 :(得分:8)

这不是last语句it's the foreach statement

  

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