gpt4 book ai didi

perl - For 循环和词法范围的变量

转载 作者:行者123 更新时间:2023-12-03 18:27:35 24 4
gpt4 key购买 nike

版本 #1

use warnings;
use strict;

my $count = 4;

for $count (1..8) {
print "Count = $count\n";
last if ($count == 6);
}

if (not defined($count)) {
print "Count not defined\n";
}
else {
print "Count = $count\n";
}
这打印:
1
2
3
4
5
6
4
为什么?因为 for循环创建它自己的 $count 的词法范围版本在它的 block 内。
版本 #2
use warnings;
use strict;

my $count;
for $count (1..8) {
print "Count = $count\n";
last if ($count == 6);
}

if (not defined($count)) {
print "Count not defined\n";
}
else {
print "Count = $count\n";
}

1
2
3
4
5
6
Count not defined
哎呀!我想捕获 $count 的退出值,但 for循环有它自己的词法范围版本 $count !.我刚刚有人花了两个小时试图追踪这个错误。
版本 #3
use warnings;
use strict;

for $count (1..8) {
print "Count = $count\n";
last if ($count == 6);
}

print "That's all folks!\n";
这给了我错误 Global symbol "$count" requires explicit package name at line 5.但是,我想 $countfor 中自动进行词法范围堵塞。似乎只有当我已经在其他地方声明了这个变量的词法范围版本时才会发生这种情况。
这种行为的原因是什么?是的,我知道 Conway 规定您应该始终使用 my对于 for循环变量,但问题是为什么 Perl 解释器是这样设计的。

最佳答案

在 Perl 中,对循环中变量的赋值总是本地化到循环中,并且循环变量始终是循环结束值的别名(这意味着您可以通过修改循环变量来更改原始元素)。对于包变量( our )和词法变量( my )都是如此。

这种行为最接近 Perl 的包变量的动态作用域(使用 local 关键字),但也适用于词法变量(在循环中或事先声明)。

但是,在循环结束后,循环值不会保留在循环变量中。对于循环范围的变量,这是相当直观的,但对于范围超出循环的变量,其行为类似于循环创建的 block 范围内的本地化值(使用 local )。

for our $val (1 .. 10) {...} 

相当于:
our $val;
my @list = 1 .. 10;
my $i = 0;

while ($i < @list) {
local *val = \$list[$i++];
# loop body
}

在纯 perl 中不可能编写扩展的词法版本,但是如果像 Data::Alias 这样的模块用来:
my $val;
my @list = 1 .. 10;
my $i = 0;

while ($i < @list) {
alias $val = $list[$i++];
# loop body
}

关于perl - For 循环和词法范围的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4432852/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com