perl v5.18.0 released!

perl v5.18.0 がリリースされました。

このリリースでの新規機能はほとんどないものの、二つの非常に大きな変更があります。

ハッシュキーのランダム化

each(), keys(), values() で返されるハッシュキーの順番がハッシュ毎にランダムになりました。同じプロセス内、同じキーセットのハッシュでさえ順番が一致しなくなります。

use 5.18.0;
use strict;
use warnings;

my %a = map { $_ => 1 } qw(foo bar baz);
my %b = %a;

say join ", ", keys %a;
say join ", ", keys %b;

実行例:

$ perl randomized-keys.pl
baz, bar, foo
foo, bar, baz

これの影響でいくつかのモジュールのテストがfailします。特にJSON::XSがこの変更に引っかかるのが有名で、 id:miyagawa さんが示唆するようにテストせずにインストールするしかありません。

一方で、むやみに--notestでインストールすると本当にモジュールが壊れていることもあるのでその判断は難しくおすすめできません*1。各モジュールが対応するまでしばらく様子をみたほうがよさそうです。

smartmatch / given-when が実験的機能に

スマートマッチ演算子とgiven-when句が実験的とされ、使用すると警告が出るようになりました。スマートマッチは仕様が複雑怪奇でバージョン毎の挙動が微妙に異なるのが問題とされていましたので、一旦リセットして検討しなおすということでしょう。given-whenまでも実験的機能になったのは残念ですが、given-whenはスマートマッチと不可分なので仕方がありません。

no warnings 'experimental'で警告を無効化できます。