Perl foreach循环变量范围

时间:2015-02-03 18:49:24

标签: perl foreach scope

我是perl的新手,在编写下面的代码片段后,我对perl范围规则感到困惑:

#!/usr/bin/perl
my $i = 0;
foreach $i(5..10){
    print $i."\n";
}
print "Outside loop i = $i\n";

我预计输出会像:

5
6
7
8
9
10
Outside loop i = 10

但它的给予:

5
6
7
8
9
10
Outside loop i = 0

因此,循环退出后变量$ i值不会改变。这是怎么回事?

3 个答案:

答案 0 :(得分:5)

根据有关foreach循环的perldoc信息:here

  

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

如果你想在循环外保留$ i的值,那么你可以在foreach循环调用中省略$ i并使用perl的特殊变量$ _,如下所示:

#!/usr/bin/perl

use strict;
use warnings;

my $i = 0;
foreach (5..10){
    print $_."\n";
    $i = $_;
}
print "Outside loop i = $i\n";

5 6 7 8 9 10 外环i = 10

答案 1 :(得分:4)

foreach将变量本地化到循环中。

use strict;
use warnings;

my $adr;
my $i = 0;
foreach $i(5..10){
    $adr = \$i;
    print "$i ($adr)\n";
}
$adr = \$i;
print "Outside loop i = $i ($adr)\n";

输出

5 (SCALAR(0x9d1e1d8))
6 (SCALAR(0x9d1e1d8))
7 (SCALAR(0x9d1e1d8))
8 (SCALAR(0x9d1e1d8))
9 (SCALAR(0x9d1e1d8))
10 (SCALAR(0x9d1e1d8))
Outside loop i = 0 (SCALAR(0x9d343a0))

来自perldoc

  

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

要保留$i的价值,您可以C使用for循环,

my $i = 0;
for ($i = 5; $i <= 10; $i++) { .. }

虽然它的可读性低于perl foreach

答案 2 :(得分:0)

变量$i在foreach范围内重新定义

foreach $i(5..10){

因此foreach之外的变量不会改变。