perl'last'语句和变量范围

问题描述 投票:3回答:1

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

谢谢!

perl loops break
1个回答
8
投票

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

foreach循环遍历正常列表值,并将标量变量VAR依次设置为列表的每个元素。如果变量前面带有关键字my,则它是词法范围的,因此仅在循环中可见。否则,该变量隐含在循环的本地,并在退出循环时重新获得其前一个值。如果先前使用my声明了变量,它将使用该变量而不是全局变量,但它仍然本地化为循环。这种隐式定位仅在foreach循环中发生。 (重点补充)。

© www.soinside.com 2019 - 2024. All rights reserved.