Perlの最新バージョンPerl 5.26リリース。インデント可能ヒアドキュメント、Unicode 9.0、長いキーのハッシュの性能改善
2017年5月30日にPerl 5.26がリリースされました! Perlの登場が1987年ですから、ついに30年目を迎えます!
機能の追加
Perl 5.26におけるいくつかの機能の追加です。便利そうなものをピックアップしてみます。
インデント可能ヒアドキュメント
インデント可能ヒアドキュメントの構文が追加されました。これは便利そうです。
my $message = <<~EOS; Hello World EOS
末尾の文字(ここではEOS)の位置が、左の位置になって、出力結果は以下のようになります。
Hello World
エディタで、ソースコードの色付けがうまくできるようになるとさらによい感じです。
Unicode 9.0のサポート
Unicode 9.0がサポートされました。Unicode 9.0でさらに追加された顔文字などを扱うことができます。
レキシカルサブルーチンの機能が正式なものに
レキシカルサブルーチンの機能が正式なものになりました。
{ my sub foo { ... } # 現在のスコープだけから呼び出せる。 title(); }
正規表現の名前付きキャプチャがわかりやすくなった
正規表現の名前付きキャプチャの利用がわかりやすくなりました。以下のハッシュ変数から、名前付きキャプチャを取り出せます。
%{^CAPTURE}
my $foo = "I am Tom";; if ($a =~ m/ (?<name>.+)$/) { my $name = ${^CAPTURE}{name}; }
「$+{name}」で参照するのは、ちょっとわかりづらかったので、これはいい機能追加だと思います。
パフォーマンスの改善
Perl 5.26におけるパフォーマンスの改善についてピックアップします。
64bit環境でハッシュのパフォーマンス改善
よりバランスを取るためにハイブリッドハッシュになりました。
16バイト以下の短いキーでは「At A Time Hard」長いキーは「Siphash 1-3」アルゴリズムを使用します。
とても長いキーではパフォーマンスが大幅に向上します、短いキーでは少しの改善があります。
ファイルからの行読み込みの高速化
ファイルを行から読み込むreadline、および「<>」演算子のパフォーマンスが向上しました。改行文字の検索方法の実装がより速いものになりました。
リファレンスの代入の高速化
他の変数にリファレンスを代入する操作が速くなりました。
my $obj1 = SomeModule->new; my $obj2 = $obj1;
split関数のパフォーマンスの改善
split関数がわずかに速くなっています。
my @elements = split ...;
リスト代入のパフォーマンスの改善
リスト代入のパフォーマンスが、3倍程度速くなりました。
my @elements = (1,2,3);
後方互換性のない変更
後方互換性のない変更です。
@INCの末尾にデフォルトで追加されていた「.」が取り除かれました
Perl 5.26においては、これは、一番大きな影響のある互換性のない変更です。モジュールの読み込みパスにカレントディレクトリがあると、セキュリティ上のリスクがあるため、これを取り除く変更が行われています。
詳しくは以下の記事に書いたのでご覧ください。
正規表現の中のエスケープされていない「{」は許可されません
これは、5.16から廃止予定になっていますが、Perl 5.26で許可されなくなりました。
# 正規表現の中で「{」を使うときは必ずエスケープ /\{/;
${^ENCODING}の機能が取り除かれました
Perl 5.18でencodingプラグマは、廃止予定になっていましたが、今回のリリースでencodingプラグマは、そのままでは動かなくなりました。encodingプラグマと内部的につながっていた、${^ENCODING}変数が取り除かれたためです。
ソースコードはUTF-8で記述して、utf8プラグマを使うようにしましょう。
もし、どうしてもencodingプラグマを使い続けたい場合は、以下のように「Filter」オプションを追加することで、対処することができます。
use encoding "euc-jp", Filter=>1;
感想
Perlをわかりやすくする変更や、パフォーマンスの改善は、歓迎です。新しいUnicodeにすぐに対応になるのもとてもよい。
「.」が@INCから取り除かれたのは、かなりのソースコードに影響を与えますが、セキュリティ上の問題を放置し続けることよりは、よい決定だと思います。
Perl 5.26へのアップグレードは、かなりの注意が必要です。事前に対処しておくのがベストです。モジュールやファイルを読み込むパスは、FindBinモジュールで、絶対パスで設定するようにするのが、よいでしょう。
Perl 5.20までは、安定で、Perl 5.22とPerl 5.24では、内部APIを使っているCoroが動かなくなるという問題が発生しました。現在はPerl 5.22では最新版のCoroは動くようですが、Perl 5.24以降では動きません。Perl 5.26では、「.」が@INCから取り除かれます。
アップグレードの注意は、Coroを利用していないことを確認することと、「.」が@INCに含まれなくなることに対する対応をすることです。
古いPerlを使っている場合は、Perl 5.20まで、まずアップグレードして、さらにそこから、最新版にアップグレードするという流れにすると、問題が起こりにくくてよいんじゃないかと思います。