[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) のところでは警告になっていますね。

なるほど、ここまで来てやっと腑に落ちました。

わざわざ指摘をくださったみなさん、ありがとうございました!