Perl 5.28リリース - Unicode 10.0サポート、文字列連結の高速化、ref関数、keys関数、forループの高速化

20180626074702

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どこでも動くよ」って感じですね。