Perl入門ゼミ

テキスト処理、Linuxサーバー管理、Web開発ならPerl
  1. Perl
  2. バージョン情報
  3. here

Perlの最新バージョン 5.24リリース - サブルーチンと数値計算の高速化、Unicode 8.0のサポート、文法機能強化

Perlの最新バージョン5.24がリリースされました。今回のリリースでは、Perlのサブルーチンと数値計算の高速がなされています。また、機能面では、Unicode 8.0のサポートがなされました。文法的な強化として、前方デリファレンスの実験的なステータスがはずされています。その他、細かなバグフィックスがなされました。

Perl 5.22に引き続きPerl 5.24では、Perlの内部コードの改善がなされています。パフォーマンスの改善という大きなメリットがありますが、いくつかの副作用もありますので、合わせて、解説します。

自分が技術的に不慣れで、安定的なPerlを望むなら、今のところPerl 5.20がおすすめです。技術的に強く、パフォーマンスの改善や新しい機能にチャレンジしたい方は、Perl 5.24にトライしてみてください。

以下で、Perl 5.24の変更点を解説します。

=====

パフォーマンスの改善

Perl 5.24の最大の変更点は、パフォーマンスの改善です。

サブルーチン呼び出しの高速化

スコープ生成と終了のオーバーヘッドをできる限り減らしたので、ループとブロックが速くなりました。たとえば、以下の空のサブルーチンは、今までの約三倍の速さで実行できます。

sub f{} f();

5.24の変更で、最もうれしいのはこれでしょう。Perlの問題点のひとつにサブルーチン呼び出しが遅いというものがありましたが、これによって、問題のひとつが改善されています。

大文字、小文字を扱う関数、正規表現のパフォーマンス改善

中国語のように、大文字小文字の区別がない言語があります。このような言語については、ロジックをスキップすることによって、ucfirst関数や「qr//i」のパフォーマンスが上昇しました。

substrの高速化

memchrがサポートされているプラットフォームにおいてsubstrが高速化されました。以下の処理が、7倍程度速くなっています。

$s = "a" x 1000 . "wxyz";
$s =~ /wxyz/ for 1..30000

足し算・引き算・掛け算の高速化

Perl 5.8.0において、64bit整数をサポートするために、数値演算が遅くなっていましたが、この遅いロジックが改善さました。Perlは、数値演算が遅いといわれますが、少し改善されました。

インクリメント・デクリメントの性能の改善

Perlのインクリメント・デクリメントの性能が改善されました。ループ処理などが、少し速くなります。

機能面の強化

Unicode 8.0のサポート

Unicode 8.0がサポートされました。PerlはUnicodeサポートの対応が速いです

新しい正規表現 \b{lb}

改行の区切りを表現する新しい正規表現「\b{lb}」が追加されました。

前方デリファレンスの実験的なステータスがとれました

Perl 5.24では、前方デリファレンスが、最初から、有効になりました。このおかげで、リファレンスからの、配列スライス、ハッシュスライス、部分ハッシュ取得、部分配列取得の処理が、記述しやすくなっています。

# 前方デリファレンス
my $nums_ref = [1, 2, 3];
my @nums = $nums_ref->@*; # (1, 2, 3);

# 前方デリファレンスを使用した配列スライス
my @nums_part = $nums_ref->@[0, 2]; # (1, 3)

my $names_h_ref = {
  ken => 1,
  taro => 2,
  kimoto => 3
};

# 前方デリファレンスを使用したハッシュスライス
my @names_part = $names_h_ref->@{'ken', 'kimoto'}; # (1, 3)

# 前方デリファレンスを使用した部分ハッシュ取得
my %names_h_part = $names_h_ref->%{'ken', 'kimoto'}; # (ken => 1, kimoto => 3)

互換性のない変更

今回のリリースでは、いくつかの実験的な機能が、削除されています。

自動デリファレンスの削除

廃止警告が出されていた、実験的な自動デリファレンスが削除されました。たとえば、以下の処理が動かなくなります。push, pop, shift, unshift, splice, keys, values, eachに、リファレンスを渡すことはできません。

レキシカルな$_が廃止されました。

Cが、Perl 5.10で、実験的に追加されましたが、これが廃止されます。

ネストされた宣言が許可されなくなった

ネストされた宣言は許可されなくなりました。以下の記述はコンパイルエラーになります。

my ($x, my($y));
our (my $x);

chdir('')は、ホームディレクトに移動できなくなりました

chdir('')は、ホームディレクトリに移動できなくなりました。chdir()を使ってください。

知られている問題

Perl 5.24では、内部的な改善のために、保証されない実装を利用している、いくつかのモジュールが、動かなくなっています。これは、現在Perlのコアチームで、議論されているので、経過を見守りましょう。

  • Algorithm::Permute
  • Coro
  • Data::Alias
  • RPerl
  • Scope::Upper
  • TryCatch
  • lexical::underscore

最近のPerlは、内部改善が多く行われているので、内部APIに依存した、文法変化形のモジュールに依存することは、リスクが伴っています。

所見

Perlのパフォーマンスが上がることはうれしい変更です。この方向性は、間違ってはいないと思います。このために、内部改善が必要ですが、そのために、いくつかの文法変化形のモジュールが、壊れるという状況になっています。

特に、議論の的としては、Coroの話題が大きいようです。将来的には、コルーチンをPerlコアのほうで、サポートするのがよいと感じました。文法変化形のモジュールが、外部のモジュールとして実装されると、常に壊れる可能性がでてくるからです。

  • Perlとはテキスト処理の記述性とパフォーマンスに優れ、正規表現が言語に組み込まれているプログラミング言語です。
  • Linuxサーバーでのフィルタリングプログラム、複数行の文字列を処理、ファイル内容の検索・置換などが得意
  • Perlはgitopensslなど広く普及したUnix/Linuxミドルウェアの補助ツールとして採用実績あり。後方互換性とポータビリティの高さがひとつの理由と推測。
  • 大量のテキストを扱うWeb開発も得意。ロングテールSEOを意識したWebサイト、アドテクやソーシャルゲームでの50ms以内のJSONの生成など。