perl5140delta

perldelta - perl v5.14.0 での変更点 - perldoc.jp
id:gfxさんのエントリで紹介されたもの以外で興味あるものだけpick up

given の返り値

given ブロックは最後に評価した式を返すようになりました (ブロックが break で終了した場合は空リストを返します)。 従って、以下のように書けるようになりました:

my $type = do {
given ($num) {
break when undef;
"integer" when /^[+-]?[0-9]+$/;
"float" when /^[+-]?[0-9]+(?:\.[0-9]+)?$/;
"unknown";
}
};

詳しくは "Return value" in perlsyn を参照してください。

srand() は種を返すようになりました

これにより、再現性のある結果が必要なプログラムが独自の種生成機構を使う 必要がなくなります。 代わりに、srand() を使って、返り値を将来の利用のために 保管しておいてください。 一つの例としては実行毎に網羅的にテストを行うには組み合わせが多すぎる テストプログラムです。 毎回ランダムな部分集合をテストして、もし失敗したら、その時の種を ログに記録することで同じ結果を生成するために使えます。

正規表現の文字列化は変更されました

デフォルトの正規表現修飾子は (?^...) を使って 記録されるようになりました。 古い文字列化に依存しているコードは動きません。 これは、文字列化は自動的に新しい修飾子に組み込まれるので、 これが起きる度に変更し続ける必要をなくすためです。

旧方式と新方式の正規表現の両方で正しく動作する必要のあるコードでは、 (perl 5.9.5 以降では; re 参照) 以下のものを使って問題全体を 回避できます:

use re qw(regexp_pattern);
my ($pat, $mods) = regexp_pattern($re_ref);

もし実際の文字列化が重要であるか、より古い Perl に対応する必要が ある場合は、以下のような方法が使えます:

# Accept both old and new-style stringification
my $modifiers = (qr/foobar/ =~ /\Q(?^/) ? "^" : "-xism";

それから -xism のかわりに $modifiers を使います。

:= は文法エラーになりました

今までは、my $pi := 4 は正確に my $pi : = 4 と等価でした; : で属性リストが開始し、= の前で終了していると扱われていました。 : = の意味となる := の使い方は 5.12.0 では非推奨となり、 今回文法エラーとなりました。 これにより、将来 := を新しいトークンとして使えるようになります。

これのためのコアのテスト以外、CPAN にこの構造を使っている Perl 5 の コードはありませんでした。 実際の世界のコードベースではほとんど影響を与えないと信じています。

(例えば、コードジェネレータのために) 空の要素リストがどうしても必要な場合は、 単に = の前に空白を追加することでエラーを回避してください。

引数なしの shift() と pop() の最適化

引数なしの (@_ が使われる) shift() と pop() の呼び出しでは使われる op が二つ少なくなりました。 この変更により、shift @_ と比べて shift() はスレッドなし perl で 5%、スレッド化 perl で 25 % 速くなります。