[perl] 繰り返し演算子x のこんな動き
さあて、クイズです。
#!/usr/bin/env perl sub counter_gen{ my $c = 1; return sub { return $c++; } } $c = counter_gen(); say x $c->(); # (1)実行すると1 と表示 say x $c->(); # (2)実行すると2 と表示 say $c->() x 2; # (3)実行すると33 と表示 $c->() x 2; # (4) say $c->(); # (?) - さあ、ここでは何が表示されるでしょう??
答え
(3)は$c->() の評価結果である3 が、繰り返し演算子x によって'33' となるのはご存知でしょうが、
(4) の部分では、なんと$c->() の評価が繰り返される動きになるようです??
結果、(?) の部分は 5 ではなく 6 ということになります。
うーむ、これは知らなかった。
…とおもったらあらら!!(後日記)
ハテブにいただいていたコメントに、色々指摘をいただいておりました。
- hirafooさん…use strict; しないコードの動き。つか$cが
- fbisさん…何か色々おかしい気が。Deparseした結果が見たい。
- kitsさん…試したところ最後の結果は5だった。/ 、say x $c->() は use warnings; では警告が出る。
あわててコードを見ると、どうも書き換え途中の動かないコードを上げていたようです。これはひどい。。。
その上、use strict; use warnings; もつけ忘れていますね。
大変申し訳ない!
気を取り直して、改めて書き直したものは以下のとおり。
#!/usr/bin/env perl use strict; use warnings; sub counter_gen{ my $c = 1; return sub { return $c++; } } my $cg = counter_gen(); print $cg->() . "\n"; # (1)実行すると1 と表示 print $cg->() . "\n"; # (2)実行すると2 と表示 print $cg->() x 2 . "\n"; # (3)実行すると33 と表示 $cg->() x 2; # (4) print $cg->() . "\n"; # (?) - さあ、ここでは何が表示されるでしょう??
そして、実行結果は...
Useless use of repeat (x) in void context at test.pl line 14. 1 2 33 5
肝心の(?) の部分は、最初に私が書いた結果とは異なり、6ではなく5 になっています。
そして(4) のところでは警告になっていますね。
なるほど、ここまで来てやっと腑に落ちました。
わざわざ指摘をくださったみなさん、ありがとうございました!