誰かがドキュメントの問題が何であるかを明確にすることができますか?それは明確に示しています:
Each ".." operator maintains its own boolean state.
「それぞれ」の意味については曖昧さがありますが、複雑な説明でドキュメントがうまく機能するとは思いません。
Perlの他のイテレータ(each
またはスカラーコンテキストglob
)が同じ問題を引き起こす可能性があることに注意してください。の状態each
は特定のコードではなく特定のハッシュにバインドされているため、ハッシュeach
を呼び出すことで(voidコンテキストでも)リセットできますkeys
。ただし、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
再帰の各深さは、個別の..演算子です。