リスト代入の不思議
スカラーの代入 { 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()である。