Perl 5.22がリリースされました - 数学関連の機能強化、メソッドのパフォーマンスの改善、正規表現の改善
2015年6月1日に、最新バージョンのPerl 5.22がリリースされました。
今回のリリースでは、活発な機能追加が行われています。
パフォーマンスの改善
Perl 5.22の一番うれしな点は、性能改善です。マルチデリファレンスの構文解析とメソッドの構文解析の改善によって、パフォーマンスがアップしています。
複数階層のデリファレンスの性能改善
Perlの内部パーサーは、複数階層のデリファレンスを効率的に解析できるようになりました。このために、複数階層のデリファレンスのパフォーマンスが上昇しています。
$scores->[0]{math};
メソッド呼び出しとSUPER擬似クラスの性能改善
メソッド呼び出しと、SUPER擬似クラスは、事前に解析され、その情報がキャッシュされるようになっています。そのため、実行時の、メソッド呼び出しのパフォーマンスが上昇しています。
$obj->method $obj->SUPER::method;
length関数の性能改善
length関数は、UTF-8ではない文字列に関して20%パフォーマンスがアップしています。
配列とハッシュの性能改善
キーが、定数か、単純な変数だった場合に、配列とハッシュの要素へのアクセスが速くなっています。
Perl 5.22の機能の追加
Perl 5.22では、数学関連の機能の改善などが行われています。
C99の数学関数が利用できるようになりました
PerlでC99でサポートされている数学関数を、POSIXモジュールを通じて利用できるようになりました。
atanh tgamma
無限とNaN(数値でない)の扱いの改善
InfとNaNがより堅固に利用できるようになりました。
16進の浮動小数点の解析が向上しました
16進の浮動小数点の解析が向上しました。また、16進で浮動少数点を記述するリテラルが追加されています。
0x1.23p-4
これで、Perlレベルで、マシンレベルと誤差のない数値を表現することが可能になっています。
このようにPerl 5.22では、数学関連の機能がかなり改善されています。
通常の括弧をキャプチャに利用しないフラグ
Perl 5.22では、正規表現の新しいフラグとして、通常の括弧をキャプチャに利用しないフラグが追加されました。これによって、複雑な正規表現を書くときに、キャプチャしない括弧「(?:)」を使わないで、簡潔に記述することができるようになりました。
"hello" =~ /(hi|hello)/n
括弧を使っていますが、この括弧はキャプチャしません。nオプションを使った場合に、キャプチャをしたい場合は、次のようにします。
"hello" =~ /(?-n:(hi|hello))/n; # $1 は "hello" "hello" =~ /(?<greet>hi|hello)/n; # $1 は "hello", $+{greet} も "hello"
複雑な正規表現を書くときは、nオプションと、名前つきキャプチャと組み合わせると見やすいのではないでしょうか。
Unicode 7.0のサポート
Perl 5.22ではUnicode 7.0がサポートされました。Unicodeのサポート対応はPerlはとても早いです。
リファレンスを通したエイリアス
Perlの機能としてエイリアスという機能が存在しているのですが、これが構文レベルで呼び出せるようになりました。この機能は実験的です。
use experimental::refaliasing; my $nums = [1, 2, 3]; my $nums_alias; \$nums_alias = \$nums;
定数関数のサポート
constサブルーチン属性によって、定数関数がサポートされました。関数は一度実効されるとその値は保存され、2回目以降は、その値を利用します。この機能は実験的です。
my $value = sub : const { 100 * 100 };
ダブルダイヤモンドオペレーター - より安全なダイヤモンドオペレーター
より安全なダブルダイヤモンドオペレーター「<<>>」がサポートされました。従来のダイヤモンドオペレーターは、二引数のopen関数を内部的に利用していましたが、ダブルダイヤモンドオペレーターは、三引数のopen関数を利用します。
my $line = <<>>;
encodingモジュールがレキシカルスコープを持つようになりました
encodingモジュールは非推奨なモジュールですが、まだ生存期間中です。それで、機能の改善としてencodingを利用したときの影響の範囲が、グローバルなものから、レキシカルなものになっています。encodingモジュールを、ファイル単位などで、部分的に利用できるようになりました。
非推奨になった機能
警告をすべて致命的なエラーに変換することは、非推奨となりました。
警告をすべて致命的なエラーにする記述は、非推奨となりました。次の記述は、今後は、非推奨ですので、避けましょう。
use warnings FATAL => 'all';
これは、Perlのコアが新しい警告を追加したときに、そのために、今まで動いていたアプリケーションが、エラーによってとまってしまうというリスクがあるためです。Perlのコアチームが、完全な互換性ではなく、新しい警告を安全に追加できるほうを選択したようです。僕も、これには、賛成です。
非互換な変更
次の記述がエラーになりました。
defined(@array) defined(%hash)
この記述は5.6.1の時点で、廃止予定となっており、5.16で、廃止予定の警告が発せられるようになっていましたが、5.22で、エラーとなりました。Perlをバージョンアップするときは、古いソースコードには、この記述がある可能性がありますので、注意してください。
コアからはずれたモジュール
CGIモジュールがコアからはずれました
CGIモジュールがコアからはずれました。これは驚きもあるかもしれませんが、時代の流れでもあります。以後は、CPANから、インストールして、利用してください。
現在では、Webフレームワークを利用して、Webアプリケーションを開発することが主流になっています。以下のページから、Web開発に必要なフレームワークを探すことができます。
Module::Buildがコアからはずれました
Module::Buildがコアからはずされました。Module::Buildが必要なときは、自動的にCPANからインストールされる仕組みがPerlには、存在するということと、コアの管理をなるべく小さくするという目的のためはずされました。
まとめ
感想を述べると、まずPerlが数学関連の機能を強化したことに好感が持てます。Perlが遅れている分野をカバーする機能追加が行われたのは、うれしいことです。
また、メソッドと複数階層のデリファレンスのパフォーマンスがアップしたのは、とてもよいことだと思います。たとえば、PerlのWebフレームワークのMojoliciousでは、Perl5.22にバージョンアップすると、20%以上のパフォーマンスの改善があったということも、報告されていました。
また、うれしいのは、警告を致命的なエラーに変換することが非推奨になったことによって、「use warnings」が「use v5.xx」としたときに、加えることができる可能性の道が開けたことです。早めの方針転換が、後々の機能改善に利いてきますので。