【问题标题】:PERL Scope in foreach loopsforeach 循环中的 PERL 范围
【发布时间】:2011-03-22 22:14:36
【问题描述】:

我有一个 perl 范围问题。

use strict;
use warnings;

our @cycles = (0,1,2,3,4);

foreach my $cycle (@cycles){
    my $nextcycle = 0;
    foreach $nextcycle (@cycles){
        if ($cycle+1 == $nextcycle){
            print "found cycle+1, $nextcycle\n";
            last;
        }
    }
    print "current=$cycle, nextcycle=$nextcycle\n";
}

我得到的输出:

找到循环+1, 1

当前=0,下一个周期=0

找到循环+1、2

当前=1,下一个周期=0

找到循环+1、3

当前=2,下一个周期=0

找到循环+1、4

当前=3,下一个周期=0

当前=4,下一个周期=0

我预料到了:

找到循环+1, 1

当前=0,下一个周期=1

找到循环+1、2

当前=1,下一个周期=2

找到循环+1、3

当前=2,下一个周期=3

找到循环+1、4

当前=3,下一个周期=4

当前=4,下一个周期=0

我进一步修改了循环,使其看起来像这样并得到了我想要的:

use strict;
use warnings;

our @cycles = (0,1,2,3,4);

foreach my $cycle (@cycles){
    my $nextcycle = 0;
    foreach my $tempcycle (@cycles){
        if ($cycle+1 == $tempcycle){
            $nextcycle = $tempcycle;
            print "found cycle+1, $nextcycle\n";
            last;
        }
    }
    print "current=$cycle, nextcycle=$nextcycle\n";
}

我想知道为什么第一个循环不起作用!

【问题讨论】:

标签: perl


【解决方案1】:

来自Perl manual on the foreach construct

foreach 循环遍历一个 正常列表值并设置 变量 VAR 是 依次列出。如果变量是 以关键字 my 开头,然后 是词法范围的,因此是 仅在循环内可见。 否则,变量是隐式的 本地到循环并重新获得它的 退出循环时的前值。

【讨论】:

    【解决方案2】:

    foreach my ... 中变量的范围是foreach 循环本身。来自perldoc perlsyn

    有一个小区别:如果变量是用my 声明的 for 的初始化部分,它们的词法范围 variables 正是 for 循环(循环体和 控制部分)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-01
      • 1970-01-01
      • 2018-08-05
      • 1970-01-01
      • 2016-01-14
      • 1970-01-01
      • 2012-12-05
      • 2022-11-29
      相关资源
      最近更新 更多