リスト代入の不思議

スカラーの代入 { x = y } が左辺値そのものを返すというのは分かりやすい。
しかし,リスト代入 { (x) = (y) } が返す値は左辺値ではない。というか,現在の実装は挙動が不安定でバグもある。

左辺値を返すように見える例:

#!perl
use feature 'say';
say scalar do{ my @a = (1 .. 10) }; # => 10 (要素数)
say join(' ', do{ my @a = (1..3) }; # => 1 2 3 (リスト)
__END__

ちょっと変な例:

#!perl
use feature 'say';
say scalar do{ my %h = (a => 1, b => 2) }; # => 4 (要素数?)
# 比較
my %h = (a => 1, b => 2);
say scalar %h; # => 2/8 (8個のスロット中2個使用済み)
__END__

バグがある例:

#!perl
use feature 'say';
say join ' ', do{ my %h = (a => 1, b => 2, a => 3, b => 4, c => 5) }; # => a 3 b 4 a 3 (?)
# 比較
my %h = (a => 1, b => 2, a => 3, b => 4, c => 5);
say join ' ', %h; # => c 5 a 3 b 4
__END__

問題個所はpp_hot.cのpp_aassign()である。