有人可以澄清文档的问题是什么吗?它清楚地表明:
Each ".." operator maintains its own boolean state.
关于“每个”的含义存在一些模糊性,但我认为复杂的解释不会很好地服务于文档。
请注意,Perl 的其他迭代器(each
或标量上下文glob
)可能会导致相同的问题。因为 for 的状态each
绑定到特定的散列,而不是特定的代码位,each
所以可以通过调用(即使在 void 上下文中)keys
散列来重置。但是对于glob
or ..
,没有可用的重置机制,除非调用迭代器直到它被重置。一个示例 glob 错误:
sub globme {
print "globbing $_[0]:\n";
print "got: ".glob("{$_[0]}")."\n" for 1..2;
}
globme("a,b,c");
globme("d,e,f");
__END__
globbing a,b,c:
got: a
got: b
globbing d,e,f:
got: c
Use of uninitialized value in concatenation (.) or string at - line 3.
got:
对于过于好奇的人,这里有一些示例,其中源中的相同 .. 是不同的.. 运算符:
单独的闭包:
sub make_closure {
my $x;
return sub {
$x if 0; # Look, ma, I'm a closure
scalar( $^O..!$^O ); # handy values of true..false that don't trigger ..'s implicit comparison to $.
}
}
print make_closure()->(), make_closure()->();
__END__
11
注释掉该$x if 0
行以查看非闭包有一个 .. 由所有“副本”共享的操作,输出为12
.
主题:
use threads;
sub coderef { sub { scalar( $^O..!$^O ) } }
coderef()->();
print threads->create( coderef() )->join(), threads->create( coderef() )->join();
__END__
22
线程代码以 .. 在线程创建之前的任何状态开始,但线程中对其状态的更改不会影响其他任何内容。
递归:
sub flopme {
my $recurse = $_[0];
flopme($recurse-1) if $recurse;
print " "x$recurse, scalar( $^O..!$^O ), "\n";
flopme($recurse-1) if $recurse;
}
flopme(2)
__END__
1
1
2
1
3
2
4
每个递归深度都是一个单独的 .. 运算符。