2

次の Perl コードは無限ループに陥ります。eachサブルーチン呼び出し後に自分自身をリセットするようです。どうしてこんなことに?

#!/usr/bin/perl
use warnings;
use strict;

my %h = ( "a" => "b" );
while ( my ($x, $y) = each %h ) {
    &do_something( \%h );
}

sub do_something(){
    my %tmp  = %{$_[0]};
}

興味深いことに、これは機能します:

while ( my ($x, $y) = each %h ) {
    &do_something( \%h );
}

sub do_something(){
}

これはしませんが:

while ( my ($x, $y) = each %h ) {
    &do_something( %h );
}

sub do_something(){
}
4

1 に答える 1

6

リストコンテキストで評価してハッシュのコンテンツを取得するには、//と同じイテレータを使用するため、ハッシュeachkeysリセットvaluesされます。

最小限のデモンストレーション:

>perl -E"%h=(a=>4); while (($k) = each(%h)) { say $k; keys %h }"
a
a
a
...

>perl -E"%h=(a=>4); while (($k) = each(%h)) { say $k; %t=%h }"
a
a
a
...

最初と3番目のスニペットではリストコンテキストでのみハッシュを評価するため、イテレータはこれら2つのスニペットでのみリセットされます。


PS —なぜ間違ったプロトタイプ(())を使用し、Perlにそれを無視するように指示するのですか(&)?

于 2012-09-18T03:52:57.027 に答える