Perl 5.28リリース - Unicode 10.0サポート、文字列連結の高速化、ref関数、keys関数、forループの高速化
Perl 5.28が2018年6月22日にリリースされました。Perl 5.28でうれしい機能をピックアップして紹介。
Unicode 10.0サポート
Unicode 10.0がサポートされました。56種類の新しい絵文字が使えるようです。
文字列連結の高速化
複数の文字列連結が、高速化されました。内部的にmulticoncatという一つのオペコードで処理するようになったからです。
以下のようなコードが高速化されます。
$s .= "a=$a b=$b\n"
たとえば、x86_64のシステムでは、以下の文字列連結のコードが4倍高速化されます。
my $s; my $a = "ab\x{100}cde"; my $b = "fghij"; my $c = "\x{101}klmn"; for my $i (1..10_000_000) { $s = "\x{100}wxyz"; $s .= "foo=$a bar=$b baz=$c"; }
さらに加えて定数文字列を含むsprintfもmulticoncatを使って、最適化されています。
ref関数の高速化
真偽値コンテキストではref関数がかなり速くなりました。真偽値コンテキストでは、一時的な文字列を作成しなくなったからです。
keys関数の高速化
keys関数は、スカラコンテキストでより最適化されました。
forループの高速化
forループとそれに類似した構文は、ほとんどのケースで、より効率的になりました。
perl -iによる置換が安全に
perl -iによるファイル内容の置換は、編集中はバックアップがとられるようになり、安全になりました。
Cent OS 5でインストールできないバグを修正
Perl 5.26はCent OS 5にインストールできませんでしたが、Perl 5.28では、インストールできるようになっています。僕の環境でも試して、インストールできることを確認!
実験的なサブルーチンシグネチャにおける属性の位置が変更
実験的なサブルーチンシグネチャにおける属性の位置が変更されました。
変更前 sub foo ($foo, $bar) : attr; 変更後 sub foo : attr ($foo, $bar)
互換性のない変更
PerlはC89が必須に
PerlのコンパイルにはC89がコンパイルできるコンパイラが必須になりました。C99やC11ではないので、見間違わないでね。
${^ENCODING}への値の設定は不正になりました
もし過去に、${^ENCODING}を設定している方がいればご注意。
sortプラグマによるsortアルゴリズムが指定できなくなりました
sortプラグマによるsortアルゴリズムが指定できなくなりました。常に、Perlデフォルトのsortアルゴリズムが使用されます。
Perl 5.28リリース雑感
今回のリリースは、小さなパフォーマンス改善が中心となるリリースに感じます。文字列のパフォーマンス改善は、すべてのPerlユーザーのメリットになるので、とてもうれしい。
最近のPerlでは、真偽値コンテキストのリファクタリングがされていて、文字列を返さなくって良い場所では、1が返されるようになって、これが高速化につながっている。
まだまだ息の長いCent OS 5にも最新のPerlがインストールできるようになって「一度書けば、Perlどこでも動くよ」って感じですね。