我是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值不会改变。这是怎么回事?
答案 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之外的变量不会改变。