Perlの最新バージョンPerl 5.26リリース。インデント可能ヒアドキュメント、Unicode 9.0、長いキーのハッシュの性能改善



  1. Perl




  2. バージョン情報



  3. here

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まで、まずアップグレードして、さらにそこから、最新版にアップグレードするという流れにすると、問題が起こりにくくてよいんじゃないかと思います。



  1. Perl




  2. バージョン情報



  3. here