NAME

perldelta - perl v5.14.0 での変更点


DESCRIPTION

この文書は 5.12.0 リリースと 5.14.0 リリースの変更点を記述しています。

5.10.0 のような以前のメジャーバージョンから更新する場合は、まず 5.10.0 と 5.12.0 の違いについて記述している perl5120delta を読んでください。

このリリースで修正されたバグのいくつかは 5.12.x のリリースに バックポートされました。 そのようなものはかっこの中に 5.12.x のバージョン番号を書いて示しています。


注意

perlpolicy に記述されているように、Perl 5.14.0 によって Perl 5.10 の サポートが公式に終了します。 Perl 5.10 以前のユーザーはより新しい Perl にアップグレードすることを 検討するべきです。


コアの拡張

Unicode

Unicode Version 6.0 に (ほぼ) 対応しました

Perl は Corrigendum #8 で 更新された Unicode 6.0 データベースを同梱していますが、後述する 一つの例外があります。 新しいリリースについて詳しくは http://unicode.org/versions/Unicode6.0.0/ を参照してください。 Perl は、このリリースで新しいものを含む、全ての Unicode 仮特性は 対応していません。

Unicode 6.0 は文字 U+1F514 に BELL という名前を選びました; これは日本の携帯電話で使われている、ベルのような形のシンボルです。 これは、BELL が ASCII BEL U+0007 を意味するという、長年の Perl の利用法と衝突します。 Perl 5.14 では、\N{BELL} は U+0007 を意味するままですが、非推奨 警告をオフにしていない限りは非推奨警告メッセージが出力されます。 Perl での U+0007 の新しい名前は ALERT です; これは既にある 短縮記法である "\a" といい感じに対応します。 \N{BEL} は U+0007 を意味し、警告も出ません。 5.14 では文字 U+1F514 に名前はありませんが、 \N{U+1F514} で 参照できます。 Perl 5.16 では \N{BELL} は U+1F514 を参照します; \N{BELL} を使っている全てのコードはアップグレードする前に \N{ALERT}, \N{BEL}, "\a" のいずれかを使うように変換するべきです。

use feature 'unicode_strings' の完全な機能

このリリースでは use feature 'unicode_strings' に関する完全な機能が 提供されます。 このスコープ内では、全ての文字列操作の処理と正規表現のコンパイルは (たとえ実行はスコープ外でも) Unicode の意味論を持ちます。 feature/"the 'unicode_strings' feature" を参照してください。 しかし、後述する 反転させた大かっこ文字クラスと複数文字の折り畳み を 参照してください。

この機能はほとんどの形の「Unicode バグ」(詳しくは perlunicode/The "Unicode Bug" を参照してください。) を回避します。 もしコード中で Unicode 文字列を操作する可能性があるなら、 不快な驚きを回避するためにこの副プラグマを使うことを 強く 推奨します。

\N{NAME}charnames の拡張

これら全ての変更について詳しくは charnames を参照してください。

問題のある (非) Unicode 符号位置のための新しい警告カテゴリ

"utf8" 副カテゴリに三つの新しい警告が追加されました。 これらによって "utf8" 警告をの一部をオフにできるようにして、残りを 警告するままにできるようになります。 三つのカテゴリとは: UTF-16 サロゲートに遭遇したときの surrogate; Unicode の非文字符号位置に遭遇したときの nonchar; Unicode の正当な上限である 0x10FFFF を超える符号位置に遭遇したときの non_unicode です。

全ての符号なし値は文字にエンコードできます

このリリースでは、Perl は(Unicode として正当でない符号位置でも)全ての 符号なし値を符号位置として扱い、警告なしで (utf8 として)内部でエンコードできるモデルを採用しています。 しかし、utf8 やそれに対応する(前述した)副カテゴリの警告を明示的に レキシカルにオフにしない限り、このような 符号位置に対して(大文字化のような) Unicode が定義している出力や操作を行うと 警告が生成されます。 (:encoding('UTF-8') 層を使うような) 厳密なルールを使っての このような値の入力は失敗するままです。 このリリースの前では、扱いは非常に矛盾していて、あちこちで間違っています。

非 Unicode 文字 (その一部は以前は Unicode 標準に反して Perl では 間違って不正なものとされていました) は常に内部で有効なものとなりました。 それらの入出力は、Unicode 標準が「開かれた交換」のため(だけ)に不正で あると言っているように、不正な Unicode 符号位置と同様に動作します。

Unicode データベースファイルはインストールされません

Unicode データベースファイルは Perl にインストールされなくなりました。 これは Perl の機能には何の影響も与えず、かなりのディスク容量を節約します。 これらのファイルが必要な場合は、 http://www.unicode.org/Public/zipped/6.0.0/ からダウンロードできます。

正規表現

(?^...) 構造はデフォルト修飾子を示します

正規表現中、ASCII キャレット "^" の直後に "(?" があると、 (/i のような)それを囲む修飾子を継承せず、 Perl のデフォルトに戻ることを意味するようになりました。 キャレットに引き続く任意の修飾子はデフォルトを上書きします。

正規表現の文字列化はこの記法を使うようになりました。 例えば、以前は qr/hlagh/i(?i-xsm:hlagh) に 文字列化されていましたが、(?^i:hlagh) に文字列化されるようになります。

この変更の主な目的は、新しい修飾子が追加されたときに変更する必要の ない 文字列化に依存したテストが行えるようにすることです。 perlre/Extended Patterns を参照してください。

この変更は、文字列化された正規表現を ?-xism を含む固定文字列と 比較しているコードを壊しそうです。

/d, /l, /u, /a 修飾子

四つの新しい正規表現修飾子が追加されました。 これらは互いに排他です: 同時には一つだけをオンにできます。

さらなる詳細については perlre/Modifiers を参照してください。

非破壊的置換

置換 (s///) と変換 (y///) 演算子は、入力変数をコピーしてから 置換を行い、結果を返す /r オプションに対応しました。 元データは変更されないままです。

  my $old = "cat";
  my $new = $old =~ s/cat/dog/r;
  # $old is "cat" and $new is "dog"

これは特に map で有用です。 さらなる例については perlop を参照してください。

再入可能な正規表現エンジン

正規表現の中で (?{...})(??{...}) コードブロックで 安全に正規表現を使えるようになりました。

しかし、これらのブロックはまだ実験的で、レキシカル (my) 変数では まだ問題があり、異常終了します。

use re '/flags'

re プラグマは、レキシカルスコープの終わりまで正規表現フラグを 有効にする機能をもつようになりました:

    use re "/x";
    "foo" =~ / (.+) /;  # /x implied

詳しくは re/"'/flags' mode" を参照してください。

8 進数のための \o{...}

ダブルクォート風コンテキストで使える、新しい 8 進エスケープシーケンス "\o" が導入されました。 この構造により、現在の最大である 0777 を超える 8 進数を使えるように なります。 また、安全に他の正規表現と結合でき、正規表現捕捉グループと混乱することなく、 8 進数で文字を指定できるようになりました。 perlre/Capture groups を参照してください。

\p{Title} の同義語としての \p{Titlecase}

この同義語は、Unicode 特性名である \p{Uppercase} および \p{Lowercase} との対称性のために追加されました。

正規表現デバッグ出力の改良

(use re 'debug' で有効になる) 正規表現デバッグ表示は、 非 ASCII 文字をエスケープするときに 8 進数ではなく 16 進数を 使うようになりました。

delete $+{...} の返り値

カスタム正規表現エンジンは %+%- の配列に対する delete の 返り値を判定するようになりました。

文法的な拡張

配列とハッシュのコンテナ関数はリファレンスを受け付けます

警告: この機能は実験的と考えられているので、正確な振る舞いは将来の バージョンの Perl では変わるかもしれません。

配列やハッシュのコンテナを直接操作する全ての組み込み関数は bless されていない配列やハッシュのハードリファレンスも 受け付けるようになりました。

  |----------------------------+---------------------------|
  | 伝統的文法                 | 簡潔文法                  |
  |----------------------------+---------------------------|
  | push @$arrayref, @stuff    | push $arrayref, @stuff    |
  | unshift @$arrayref, @stuff | unshift $arrayref, @stuff |
  | pop @$arrayref             | pop $arrayref             |
  | shift @$arrayref           | shift $arrayref           |
  | splice @$arrayref, 0, 2    | splice $arrayref, 0, 2    |
  | keys %$hashref             | keys $hashref             |
  | keys @$arrayref            | keys $arrayref            |
  | values %$hashref           | values $hashref           |
  | values @$arrayref          | values $arrayref          |
  | ($k,$v) = each %$hashref   | ($k,$v) = each $hashref   |
  | ($k,$v) = each @$arrayref  | ($k,$v) = each $arrayref  |
  |----------------------------+---------------------------|

これにより、これらの組み込み関数は、長いデリファレンスチェーンや サブルーチンの返り値を@{}%{} で囲む必要がなくなりました:

  push @{$obj->tags}, $new_tag;  # old way
  push $obj->tags,    $new_tag;  # new way
  for ( keys %{$hoh->{genres}{artists}} ) {...} # old way 
  for ( keys $hoh->{genres}{artists}    ) {...} # new way

単一表現プロトタイプ

+ プロトタイプは $ の特殊な代替物で、リテラルな配列やハッシュ変数が 与えられたときには \[@%] のように働きますが、その他の場合では 引数にスカラコンテキストを強制します。 perlsub/Prototypes を参照してください。

package ブロック文法

パッケージ宣言にコードブロックを含むことができるようになりました; ただし宣言のスコープがそのブロックの内側だけの場合です。 従って、package Foo { ... } は正確に { package Foo; ... } と同じです。 これはまた、もっとも魅力のある機能である package Foo 1.2 { ... } のように 宣言でのバージョン番号でも動作します。 perlfunc を参照してください。

文ラベルはより多くの場所に置けるようになりました

文ラベルは package など、あらゆる種類の文や宣言の前に 置けるようになりました。

スタックしたラベル

一つの文の前に複数の文ラベルを置けるようになりました。

大文字の X/B を 16 進/2 進リテラルとして使えます

リテラルは、以前から対応していた 0x... および 0b... の接頭辞に 加えて、大文字の 0X... および 0B... も使えるようになりました [perl #76296]。

C, Ruby, Python, PHP はすでにこの文法に対応していて、Perl でも内部的に より一貫性があるようになりました: eval sprintf "%#X", 0x10 という往復は、 eval sprintf "%#x", 0x10 と同様に 16 を返します。

オーバーライド可能な tie 関数

tie, tied, untie はオーバーライド可能になりました [perl #75902]。

例外処理

信頼性と一貫性の向上のために、die, warn, $@ の振る舞いが いくつか変更されました。

その他の拡張

$0 への代入は Linux では prctl() を使って伝統的なプロセス名を設定します

Linux では、伝統的なプロセス名は、perl が バージョン 4.000 から行っている argv[0] 経由で POSIX 名を置き換えることに加えて、prctl(2) を使って 設定されます。 ps, top, killall のような伝統的なプロセス名を読み込むシステム ユーティリティは $0 へ代入することで設定した名前を 認識するようになります。 文字列は 16 バイトで切り詰められます; これは Linux による制限です。

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

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

printf 風の関数は 1980 年代以降のサイズ修飾子を理解します

Perl の演算子 printf と sprintf、および Perl の内部の printf 代替 関数は、C90 サイズ修飾子である "hh" (char), "z" (size_t), "t" (ptrdiff_t) を認識するようになりました。 また、C99 コンパイラでコンパイルした場合、Perl はサイズ修飾子 "j" (intmax_t) を認識するようになりました(しかしこれは 互換性がありません)。

それで、例えば、最近のマシンなら、sprintf('%hhd', 257) は "1" を 返します。

新しいグローバル変数 ${^GLOBAL_PHASE}

新しいグローバル変数 ${^GLOBAL_PHASE} が追加され、Perl インタプリタの 現在のフェーズの内部状態がわかるようになりました。 これは perlvar/"${^GLOBAL_PHASE}"perlmod/"BEGIN, UNITCHECK, CHECK, INIT and END" で 詳しく説明されています。

-d:-fooDevel::foo::unimport を呼び出します

The syntax -d:foo was extended in 5.6.1 to make -d:foo=bar equivalent to -MDevel::foo=bar, which expands internally to use Devel::foo 'bar'. Perl は、モジュール名の接頭辞に - を使えるようになりました; これは -M と同じ意味論です; すなわち

-d:-foo

-M-Devel::foo と等価で、no Devel::foo; に拡張され、もし メソッドがあるなら Devel::foo->unimport() を呼び出します。

-d:-foo=bar

-M-Devel::foo=bar と等価で、no Devel::foo 'bar'; に拡張され、 もしメソッドがあるなら Devel::foo->unimport('bar') を呼び出します。

これは、Devel::* モジュールの import メソッドのデフォルトのアクションを 抑制する一方、デバッグのために読み込みたい場合に特に有用です。

ファイルハンドルメソッド呼び出しは IO::File をオンデマンドで読み込みます

ファイルハンドルへのメソッド呼び出しが、メソッドが解決できないために die し、IO::File が読み込まれていない場合、Perl は require 経由で IO::File を読み込んで、もう一度メソッド解決を試みます:

  open my $fh, ">", $file;
  $fh->binmode(":raw");     # loads IO::File and succeeds

これはまた、STDOUT, STDERR, STDIN のようなグロブに対しても 動作します:

  STDOUT->autoflush(1);

このオンデマンドの読み込みはメソッド解決が失敗したときにのみ発生するので、 部分的なメソッド対応のために IO::File 親クラスを手動で読み込むという 伝統的な手法も予想通り動作します:

  use IO::Handle;
  open my $fh, ">", $file;
  $fh->autoflush(1);        # IO::File not loaded

改良された IPv6 対応

Socket モジュールは IPv6 に関する新しい情報を提供します; Socket::getaddrinfo() 関数と Socket::getnameinfo() 関数の実装、 関連する定数、便利な新しい関数などです。 Socket を参照してください。

DTrace プローブはパッケージ名を含むようになりました

DTrace プローブは追加の引数 arg3 を含むようになりました; これは 出入りすることでコンパイルされたパッケージを含んでいます。

例えば、以下の DTrace スクリプトを使って:

  perl$target:::sub-entry
  {
      printf("%s::%s\n", copyinstr(arg0), copyinstr(arg3));
  }

実行すると:

  $ perl -e 'sub test { }; test'

DTrace は以下のように表示します:

  main::test

新しい C API

内部の変更 を参照してください。


セキュリティ

ユーザー定義正規表現特性

perlunicode/"User-Defined Character Properties" で、"In" または "Is" で 始まる名前のサブルーチンを定義することでカスタム特性を作ることができると 文書化されています。 しかし、Perl は実際にはこの命名の制限は実行しておらず、 \p{foo::bar} が foo::bar() を(存在していれば) 呼び出していました。 文書化された規約は実行されるようになりました。

また、Perl はユーザー定義特性を起動するのに汚染された正規表現を 使わなくなりました。 代わりに単に die します [perl #82616]。


互換性のなくなる変更

Perl 5.14.0 は以前の安定リリースとバイナリ互換性はありません。

以下の章に加えて、C API の変更 を参照してください。

正規表現と文字列のエスケープ

反転させた大かっこ文字クラスと複数文字の折り畳み

いくつかの文字は、Unicode ルールでの /i 正規表現マッチングでは 2 または 3 文字の並びにマッチングします。 一つの例としては、LATIN SMALL LETTER SHARP Sss という並びに マッチングします。

 'ss' =~ /\A[\N{LATIN SMALL LETTER SHARP S}]\z/i  # Matches

しかしこれは、特に反転させたときに、とても非直観的な結果を導いていました。 これにより、Perl 5.14 は反転させた文字クラスでの複数文字の /i マッチングを使わなくなりました。

 'ss' =~ /\A[^\N{LATIN SMALL LETTER SHARP S}]+\z/i  # ???

これは、SHARP S や、/i の元で SHARP S にマッチングしないあらゆる 文字の並びにマッチングするべきです。 "s"SHARP S ではありませんが、Unicode は /i の元では "ss"SHARP S にマッチングするとしています。 そこで、どちらが「勝つ」べきでしょうか? 文字列に ss があるという理由でマッチングは失敗するでしょうか、それとも 一つの s に匹津津井で一つの s があるので成功するでしょうか?

Perl の以前のリリースは複数文字のマッチングを許していましたが、バグにより、 ほとんど動作していませんでした。

\400-\777

ある種の環境では、正規表現中での \400-\777 の使用は、 その他の全てのダブルクォート風コンテキストでの使用と異なっていました。 5.10.1 から、Perl はこれが起きたときには非推奨警告メッセージを 出力していました。 今では、これらのリテラルは全てダブルクォート風コンテキストと同じ 振る舞いをするようになりました; つまり、\x{100}-\x{1FF} と等価で、 非推奨警告も出ません。

\400-\777 のコマンドラインオプションでの使用 -0 は、 慣習的な今の意味のままです。 これは入力ファイル全体を読み込みます; 以前は、これは -0777 とだけ 文書化されていました。

様々なあいまいさがあるので、8 進数で文字を表現する場合は 新しい \o{...} 構文を使うべきです。

ほとんどの \p{} 特性は大文字小文字なしのマッチングから免除されるようになりました

ほとんどの Unicode 特性について、/i 大文字小文字無視オプションの ありなしでマッチングが変わるというのは意味がありません。 このことで予想外の結果と潜在的なセキュリティーホールを導きます。 例えば

 m/\p{ASCII_Hex_Digit}+/i

これは以前は Unicode マッチングルールによって(これに関するいくつかのバグが ありましたが)非 ASCII 文字にマッチングします。 今では /i の下では、人々が違いを心に浮かべるようないくつかの 特性(特に m/\p{Uppercase}/i and m/\p{Lowercase}/i (どちらも m/\p{Cased}/i でマッチングする符号位置と同じものにマッチングします) のような、意味的に大文字小文字が不可欠な部分を占めるような名前のもの)を除いて、 非 /i マッチングと同じ結果となります。 詳細は perlrecharclass/Unicode Properties にあります。

/i によってマッチングの結果を変える必要があるユーザー定義特性ハンドラは、 大文字小文字を無視するマッチングが有効の時には非 0、そうでない場合は 0 を 取る、新しく渡される真偽値パラメータを読むように変更しなければなりません。 perlunicode/User-Defined Character Properties を参照してください。

\p{} は Unicode の意味論を暗黙に使います

パターン中に指定された Unicode 特性マッチングは、\N{NAME} と同様、この パターンは Unicode ルールに従ってマッチングすることを 意味しているということを示すようになりました。

正規表現は展開されたときにロケール性を保持します

use locale が有効な状態でコンパイルされた正規表現は、use locale の 外側でコンパイルされた新しい正規表現に展開されたときも有効のままになります (また逆も成り立ちます)。

以前は、他の正規表現に展開された正規表現はその時点でのロケール状態を 継承し、最初に持っていたロケール状態を失っていました。 これはバグ修正と考えられていますが、この正しくない振る舞いに依存していた コードをつまずかせるかもしれません。

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

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

旧方式と新方式の正規表現の両方で正しく動作する必要のあるコードでは、 (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 を使います。

正規表現内の実行時コードブロックはプラグマを継承します

正規表現中のコードブロック ((?{...})(??{...})) は、 以前は正規表現が実行中に以下の二つのような状態になった場合に全ての プラグマ(strict, warnings など) が継承されていませんでした:

  use re "eval";
  $foo =~ $bar; # when $bar contains (?{...})
  $foo =~ /$bar(?{ $finished = 1 })/;

このバグは修正されましたが、 このバグっぽい振る舞いに依存しているコードは正しい振る舞いに 対応するように修正する必要があるかも知れません。

スタッシュとパッケージ変数

ローカル化された tie されたハッシュと配列はもう tie しません

以下のような場合:

    tie @a, ...;
    {
            local @a;
            # here, @a is a now a new, untied array
    }
    # here, @a refers again to the old, tied array

以前のバージョンの Perl では間違って新しいローカルな配列を tie していました。 これは修正されました。 しかしこの修正によってコードの振る舞いの変化を引き起こすかも知れません。

スタッシュはいつも定義されるようになりました

defined %Foo:: は、例えこのパッケージでまだ何のシンボルも 定義されていなくても、常に真を返します。

これは、5.10.0 で追加された、ハッシュの内部ストレージの変更の副作用を 隠すためのトークナイザの特別な場合のその場しのぎの副作用です。 この修正はハッシュのメモリオーバーヘッドを劇的に減少させます。

スタッシュに対して defined を呼び出すことは 5.6.0 から非推奨になり、 レキシカルでは 5.6.0 から警告が出力され、スタッシュとその他の パッケージ変数に対しては 5.12.0 から警告を出していました。 defined %hash は常に実装の詳細を露出させていました: 全てのエントリを削除することでハッシュを空にしても defined %hash は偽になりませんでした。 従って、defined %hash は、任意のハッシュが空かどうかを判定するには 不正なコードです。 代わりに、空の %hash はスカラコンテキストでは常に偽を返すという 振る舞いを使ってください。

スタッシュのクリア

スタッシュリスト代入 %foo:: = () は、一時的に無名の空のスタッシュを 作っていました。 その結果、どこかでリファレンスされているサブルーチンも無名になり、 caller では "(unknown)" になります。 今ではパッケージ名を保持するようになったので、caller は型グロブへの リファレンスがあれば元のサブルーチン名を、さもなければ "foo::__ANON__" を返します [perl #79208]。

型グロブのデリファレンス

型グロブをスカラ変数に代入すると:

    $glob = *foo;

$glob にコピーされたグロブは、このグロブが単なるコピーであることを 示す特別なフラグが付けられます。 これにより、引き続く $glob への代入によってグロブを上書きできます。 しかし、元のグロブは変更されません。

一部の Perl 演算子はこの2種類のグロブを区別していませんでした。 これにより、エッジケースでは不思議な振る舞いを見せていました: untie $scalar は、最後に代入されたものがグロブの場合はスカラを untie しませんでした (なぜならこれはハンドルを untie する untie *$scalar として扱われるからです)。 (*$glob = \@some_array のような) グロブスロットへの代入は単に \@some_array$glob に代入します。

これを修正するために、*{} 演算子 (*foo*$foo の 形式を含みます) は、もしオペランドがグロブのコピーなら新しい変更不能の グロブを作るように修正されました。 これにより、演算子がグロブとスカラを修正するときの区別は、変更不能のグロブを グロブとして扱うだけになりました。 (tie, tied, untie は、互換性の理由によりそのまま残されましたが、 警告が出ます。 非推奨 を参照してください。)

これは、演算子がグロブのコピーを渡すときに *{} の返り値をグロブに 代入するコードでは非互換の変更になります。 例えば、以下のようなコードの場合:

    $glob = *foo;
    *$glob = *bar;

2 行目の *$glob は新しい変更不能のグロブを返します。 新しいグロブは *bar への別名として作られます。 それからこれは捨てられます。 従って、2 行目の代入では何も起こりません。

さらなる詳細については http://rt.perl.org/rt3/Public/Bug/Display.html を 参照してください。

main パッケージ外のマジカル変数

Perl の以前のバージョンでは、 $!, %SIG などのようなマジカル変数は 他のパッケージへ「漏洩」していました。 それで %foo::SIG がシグナルのアクセスに使えたり、 (strict モードがオフなら) ${"foo::!"} (with strict mode off) が C の errno へのアクセスに使えたり、などです。

これはバグ、あるいは「想定外の」機能でした; これにより、モジュールが 読み込まれるときにシグナルハンドラがクリアされるといったさまざまな 悪影響を引き起こしていました。

これは修正されました (あるいは見方によっては、この機能は取り除かれました)。

local($_) は $_ から全てのマジカルな機能を取り去ります

スカラ変数に local() を行うと新しい値が与えられますが、全てのマジカルな 機能はそのままでした。 perlsub はデフォルトスカラ変数 $_ に代入する全てのサブルーチンはまず ローカル化することを勧めていますが、$_ に対しては問題があることが 判明しています。 これにより、もし $_ が読み込み専用変数の別名となっていると例外が 投げられ、一般的には様々な想定外の副作用があります。

従って、一般的なルールへの例外として、local($_)は $_ に新しい値を 代入するだけでなく、全てのマジカルな機能が取り除かれるようになりました。

パッケージ名と変数名のパース

パッケージ名とパッケージ変数のパースが変わりました: foo::::bar のような連続するコロンの組は、全てパッケージセパレータとして 扱われます。

この変更に関係なく、パッケージセパレータの正確なパースは保証されず、 将来のバージョンの Perl では変更される可能性があります。

文法や Perl の演算子の変更

given の返り値

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

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

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

ある種のプロトタイプのパースの変更

以下のプロトタイプで宣言された関数は、正しく単項関数として 振る舞うようになりました:

  *
  \$ \% \@ \* \&
  \[...]
  ;$ ;*
  ;\$ ;\% etc.
  ;\[...]

このバグ修正 [perl #75904] により、(*), (;$), (;*) プロトタイプを 使った関数は以前より高い優先順位でパースされます。 従って、以下のようなコードは:

  sub foo(;$);
  foo $a < $b;

2 行目は foo($a < $b) ではなく、正しく foo($a) < $b と パースされます。 これはかっこなしの引数で以下の演算子のいずれかが使われたときに起こります:

  < > <= >= lt gt le ge
  == != <=> eq ne cmp ~~
  &
  | ^
  &&
  || //
  .. ...
  ?:
  = += -= *= etc.
  , =>

配列スライスに対するスマートマッチング

以前は、以下のコードはマッチングに成功していました:

    my @a = qw(a y0 z);
    my @b = qw(a x0 z);
    @a[0 .. $#b] ~~ @b;

このおかしな振る舞いは修正されました [perl #77468]。

否定は文字列を以前より異なったものとして扱います

単項否定演算子 - は数値のように見える文字列を数値として扱うように なりました [perl #57706]。

負数のゼロ

負数のゼロ (-0.0) は、文字列に変換したとき、どのプラットフォームでも "0" になるようになりました。 以前はプラットフォームによって "-0" だったり "0" だったりしていました。

未だにゼロが負数かどうかを決定したい場合は、 sprintf("%g", $zero) =~ /^-/ とするか、CPAN にある Data::Float モジュールを使ってください。

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

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

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

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

識別子のパースの変更

Unicode の "XIDStart" 集合外の文字は識別子の先頭としてはもはや 許されなくなりました。 これは、普通は英文字に引き続くある種のアクセントやマークはもはや 識別子の最初の文字にはならないことを意味します。

スレッドとプロセス

ディレクトリハンドルはスレッドにコピーされません

Windows 以外で fchdir 関数のないシステムでは、新しく作られたスレッドが 親スレッドからディレクトリハンドルを継承しなくなりました。 このようなプログラムはどちらにしろ普通はクラッシュします[perl #75154]。

共有されたパイプに対する close

デッドロックを避けるために、close 関数は、もし基となるファイル記述子が 他のスレッドで使われている場合は、子プロセスの終了を待たなくなりました。 このような場合は真を返します。

fork() エミュレーションはシグナルを送られた子プロセスを待ちません

Windows では、親プロセスはフォークした子プロセスが全て終了するまで 終了しません。 しかし、kill("KILL", ...) は本質的に疑似プロセスにとっては不安定で、 kill("TERM", ...) は、子プロセスがシステムコールでブロックしているときは 配達されないかもしれません。

デッドロックを避けつつ、ホスティングプロセスを終了するための安全な 機構を提供するために、SIGTERM シグナルを送られた子プロセスを 待たなくなりました。 これは、子プロセスの後片付け処理が終了できるようにしなければならない 場合にこれらの子プロセスに waitpid() をする親プロセス次第です。 しかし、子プロセスが I/O をブロックできないことを確実にすることで デッドロックを避けるために親が責任を持ちます。

Windows での fork() エミュレーションに関するさらなる情報については perlfork を参照してください。

設定

Policy_sh.SH の命名の修正によって Policy.sh が不正になりました

Policy_sh.SH での、いくつの長年のタイプミスと命名の混乱が修正され、 config.sh で使われる変数名が正規化されました。

これは、この間違ったふるまいに偶然依存している場合の Policy.sh の 振る舞いが変更されます。

Windows では Perl ソースコードをテキストモードで読み込みます

Perl スクリプトは、Windows では ByteLoader モジュール (もはや コア Perl の一部ではありません) のメリットを使うためにバイナリモードで 読み込まれていました。 これは、DATA ファイルハンドルに対する seek()/tell() および 単に system(), 逆クォート, fork() などの呼び出しによってファイルハンドルが フラッシュした後に DATA からの読み込みを含む様々な操作を 壊すという副作用がありました。

Windows でのデフォルトのビルドオプションは、Windows では Perl の ソースコードをテキストモードで読み込むように変更されました。 ByteLoader が(出来れば)この状況を自動的に扱えるように CPAN で更新されます [perl #28106]。


非推奨

非推奨の C API も参照してください。

正規表現と引き続く単語の間の空白の省略

正規表現演算子やその修飾子と、引き続く単語の間の空白を省略することは 非推奨となりました。 例えば、m/foo/sand $bar はまだ m/foo/s and $bar と パースされますが、警告が出ます。

\cX

バックスラッシュ-c 構造は表示できない文字を指定する方法として 設計されましたが、(ASCII プラットフォームでは) c に引き続く文字に 制限はありませんでした。 この文字が ASCII 文字でない場合は非推奨警告が出るようになりました。 また、"\c{" (これは単に ";" と書くのと同じです) でも非推奨警告が出ます。

"\b{""\B{"

正規表現において、リテラルの "{" の(大かっこの文字クラスの中でなく)直後に "\b""\B{" を続けることは、Perl 自身が将来使えるようにするために、 非推奨となりました。

Perl 4 時代の .pl ライブラリ

Perl は Perl 5 より前のライブラリファイルを少量同梱しています。 同梱ファイルのほとんどは(今では CPAN から利用可能ですが) 非推奨となりました。 影響を受けるファイルは、コアの一部としてインストールされている場合は 実行時に警告が出るようになりました。

これは -X やレキシカルな警告ビットに従うのではなく、強制的な警告です。 この警告は、コアで非推奨となった .pm ライブラリのための deprecate.pm によって供給されます。 これは .pl ライブラリを含んでいる特定の CPAN 配布を示しています。 もちろん、CPAN 版は警告は出ません。

$[ へのリスト代入

$[ への代入は Perl バージョン 5.12.0 から非推奨となり、警告が出ます。 このバージョン (5.14) の Perl はまた、リストコンテキストでの $[ への代入も 警告を出すようになりました。 これは 5.12.0 での見落としを修正します。

かっことしての qw(...) の使用

歴史的に、パーサは qw(...) リテラルは常にかっこに囲まれていると考えるように 自分をだましていて、結果として、時々それらの周りのかっこを省略できました:

    for $x qw(a b c) { ... }

パーサはもはや自分自身をこの方法でだましません。 以下のように、リストリテラルをかっこで囲んでください:

    for $x (qw(a b c)) { ... }

これは、for $i (1,2,3) { ... } のかっこは式の文法の一部ではないので、 非推奨となりました。 これは文の文法の一部で、for 文はリテラルなかっこが必要です。 qw 式が要求する合成されたかっこは、式文法の一部として扱うことを 対象としているだけです。

これは以下のような場合の振る舞いは変更しないことに注意してください:

    use POSIX qw(setlocale localeconv);
    our @EXPORT = qw(foo bar baz);

ここでは式の回りにかっこは不要です。

\N{BELL}

これは、Unicode がこの名前を違う文字に使っているからです。 さらなる説明については Unicode Version 6.0 に (ほぼ) 対応しました を 参照してください。

?PATTERN?

(最初の m のない) ?PATTERN? は非推奨となり、警告を出すようになりました。 これは、将来 ? を新しい演算子として使えるようにするためです。 一度だけマッチングする機能は今でも m?PATTERN? として利用可能です。

型グロブを保持しているスカラに対する tie 関数

tie 関数 (tie, tied, untie) をスカラ引数で呼び出すと、 もしそのスカラがたまたま型グロブを保持していた場合はファイルハンドルに対して 動作します。

これは Perl 5.16 で削除される予定の長年のバグです; 型グロブを保持している スカラ自身を tie する方法がなく、型グロブを代入されたスカラを untie する方法もないからです。

tie 関数が明示的な * なしにハンドルに対して使われると、非推奨警告が 出るようになりました。

ユーザー定義の大文字小文字定義

この機能は perlunicode/User-Defined Case Mappings (for serious hackers only) に 文書化されているように多くの問題を抱えているので、非推奨となりました。 この機能は Perl 5.16 で削除されます。 代わりに、改良された機能を提供する、CPAN モジュール Unicode::Casing を 使ってください。

非推奨モジュール

以下のモジュールは将来のリリースではコア配布からは取り除かれ、 代わりに CPAN からインストールするようになります。 CPAN での配布物のでこのモジュールが必要な場合は、事前条件に追加する 必要があります。 これらのモジュールのコア版は、非推奨警告を発生させます。

単独、あるいはより大きいシステムの一部として、パッケージ版の Perl を 出荷する場合、非推奨のコアモジュールの影響を注意深く検討するべきです。 非推奨モジュールを perl ライブラリディレクトリ vendorsite にインストールして Perl のデフォルトビルドを 出荷したいかもしれません。 これは非推奨警告を抑制します。

あるいは、lib/deprecate.pm にパッチを当てて、 あなたのパッケージシステムや配布が、単一のパッケージのインストールがある 機能を提供するリリースから、同じ機能を得るために複数のパッケージを インストールすることをシステム管理者が知る必要があるより新しいリリースへの 段階的な移行する方法と一貫した、あなたのパッケージシステムや Perl の配布に固有の警告メッセージを提供したいかもしれません。

モジュールを CPAN からインストールすることによって、非推奨警告を 消すことができます。 これら全ての最新版をインストールするには、単に Task::Deprecations::5_14 をインストールしてください。

Devel::DProf

Devel::Dprof の代わりに Devel::NYTProf をインストールして使うことを 強く推奨します; Devel::NYTProf は著しく改良されたプロファイリングと報告を提供します。


性能の改善

「安全なシグナル」の最適化

シグナル発行は実行ループから制御 op に移動しました。 これにより、速度が数 % 向上し、5.8.0 で導入された「安全なシグナル」による 速度の低下のほとんど全てを取り除けているはずです。 シグナルは以前と同じように、同じ文の中で発行されます。 もしこれが 起こらない か、あるいはもし中断不能なループが作成できることを 発見したなら、それはバグです; 問題を再現する方法を報告してください。

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

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

正規表現の文字列比較作業の最適化

(正規表現エンジンによって激しく利用される)大文字小文字を無視した文字列 比較を行う foldEQ_utf8 API 関数は大幅にリファクタリングされ 最適化されました - そしておまけとしてドキュメントが大幅に向上しました。

正規表現のコンパイルの高速化

正規表現を utf8 に昇格する必要があるけれどもコンパイル開始時には 分かっていなかった場合の正規表現のコンパイルが高速化されました。

文字列追加は 100 倍速くなりました

多くの文字列追加を行うとき、システムの malloc 実装を使うように ビルドされている perl は、最終的に必要な分よりもとても 多くのメモリを非効率な方法で割り当ててしまうことがありました。

文字列を追加するときにもし必要ならより多くのメモリを割り当てていた sv_grow 関数は、ある種の等比級数に切り上げたメモリを伝えるようになり、 特定のプラットフォームと設定ではとても早くなりました。 Win32 では、これは約 100 倍高速です。

iスレッドでの PL_* アクセサ関数の削除

MULTIPLICITY が最初に開発され、インタプリタの状態が interpreter 構造体に 移動したとき、スレッドとインタプリタローカルな PL_* 変数は、 アクセサ関数を呼び出して perl コアの外側のアドレスを返すマクロとして 定義されていました。 この目的は、バイナリ互換性を壊すことなく interpreter 構造体にある メンバのサイズを変えられるようにすることでした; それでバグ修正はそのようなサイズ変更が必要なメンテナンスブランチに マージできるようになっていました。 この機構は冗長であり、正しい振る舞いをするコードがこれによって ペナルティを受けていました。 これは削除されました。

弱い参照の解放

あるオブジェクトに多くの弱い参照があると、そのオブジェクトを解放するときに 状況によっては O(N&0xB2;) (N は参照の数) の時間がかかることが ありました。 そうなる状況の数は減少しました [perl #75254]。

レキシカルな配列やハッシュへの代入

my @array = ...my %hash = ... の代入を高速化するために 以前行われた最適化はバグを引き起こしていたので Perl 5.12.0 で 無効化されました。

このような代入を高速化する新しい方法が発見されました [perl #82110]。

@_ のメモリ消費が減りました

以前は、@_ の割り当ては四つのエントリに十分なスペースで全ての サブルーチンに対してコンパイル時に行われていました。 この割り当てはサブルーチンが呼び出されるときにオンデマンドで 行われるようになりました [perl #72416]。

SV 構造体と HV 構造体のサイズ最適化

xhv_fillstruct xpvhv から削除され、ハッシュ毎に 1 IV 節約される ことにより、システムによっては struct xpvhv がキャッシュ境界に 一致するようになりました。 このメモリ節約が他の場所での低速化を引き起こすことを避けるために、 HvFILL の真偽値での使用は代わりに (等価である) HvTOTALKEYS を 使うようになりました; それで実際に必要なときに埋められるデータは オンデマンドで計算されるようになりましたが、これが必要になるような状況は 稀なはずです。

SV ボディの構造体要素の順番が変更されました。 事実上は、NV スロットが STASH および MAGIC の位置と交換されました。 SV メンバへの全てのアクセスはマクロ経由なので、これは完全に透過的です。 この変更により、上述した PVHV のスペース節約が可能になり、 アーキテクチャによっては PVIV に必要なメモリ割り当てが減少します。

XPV, XPVIV, XPVNV は実際に使用される SV ボディの一部としてのみ 割り当てられるようになり、スペースが節約されます。

正規表現を含むスカラは実際に使用される SV ボディの一部としてのみ 割り当てられるようになり、スペースが節約されます。

Exporter のメモリ消費の改善

@EXPORT_FAIL AV は必要になるまで作成されなくなり、従ってどちらもそれに もどる型グロブではありません。 これにより、Exporter を使うけれどもこの機能を使わないパッケージ毎に 200 バイトほど節約できます。

弱い参照のメモリ節約

弱い参照については、参照先毎に一つだけの弱い参照というよくあるケースでは 必要なメモリを減らすように最適化されました。 この場合、参照先毎に等価な一つの小さな Perl 配列を節約できます。

%+%- のメモリ消費が減りました

Tie::Hash::NamedCapture モジュールの塊が Perl コアで使われていました。 これは XS モジュールに移動し、%+%- を使わないプログラムのための オーバーヘッドが減少しました。

スレッドに関する複数の小さな改善

スレッドのための内部構造体は API 呼び出しと割り当てが減少し、 結果としてオブジェクトコードが大幅に小さくなりました。 さらに、多くのスレッドコンテキストチェックは保留されていたので、 必要になったときにだけ行うようになりました(ただしこれはデバッグビルドでない 場合にのみ可能です)。

連続している netstate op コードの組は最適化で削除されます

以前は、以下のようなコードは

    use constant DEBUG => 0;
    sub GAK {
        warn if DEBUG;
        print "stuff\n";
    }

warn if DEBUG のための op は null op (ex-const) に畳み込まれますが、 nextstate op はそのまま残るので、実行時に nextstate, nextstate といった op が発行されていました。

連続した nextstate op の実行は単なる最後の nextstate op の実行と 同じなので、覗き穴最適器は最初の nextstate op の組を 削除するようになりました; 先頭がラベルの場合は例外です; なぜならラベルは 最適化器によって削除されてはならず、ラベルの利用法はコンパイル時には決定的には 分かっていないからです。


モジュールとプラグマ

新しいモジュールとプラグマ

更新されたモジュールとプラグマ

削除されたモジュールとプラグマ

Perl 5.12.0 のリリースノートで約束した通り、以下のモジュールがコア配布から 削除されました; もし必要なら代わりに CPAN からインストールしてください。

Shell の削除は 5.14 以降まで延期されました; 5.12.0 で出荷された Shell の実装が、コアから削除される予定であるという 警告を正しく出力していなかったからです。


文書

新しい文書

perlgpl

perlgpl は Perl と配布されている README に含まれていたままの形の GPL バージョン 1 を含むように更新されました。

Perl 5.12.x delta files

Perl 5.12.1 から 5.12.3の perldelta ファイルがメンテナンスブランチから 追加されました: perl5121delta, perl5122delta, perl5123delta

perlpodstyle

POD 文書のための新しいスタイルガイドで、ほとんどは pod2man(1) man ページの NOTES の節から分離されました。

perlsource, perlinterp, perlhacktut, perlhacktips

後述する perlhack と perlrepository の刷新 を参照してください。

既存の文書の変更

perlmodlib が完全になりました

Perl 5.12.0 の perlmodlib ページは、リストを生成するスクリプトのバグにより、 多くのモジュールが漏れていました。 これは修正されました [perl #74332] (5.12.1)。

perlebcdic の間違った tr/// の置き換え

perlebcdic には EBCDIC と Latin1/ASCII を変換するために tr/// を使うのに便利な表があります。 表は記述されているのと逆になっていましたが、表で使われているコードは 特定の例では正しく動作していました。

表は逆順に変更され、サンプルコードも対応するように変更されました。

また、表は 8 進数から 16 進数に変更され、pod にあるレシピは全ての値が 同じ長さになるように先頭にゼロが表示されるように変更されました。

ユーザー定義の大文字小文字定義に関するトリック

perlunicode は、Perl が Unicode データに対して大文字、小文字、それ以外 の変換をどのように行うかについてのオーバーライド、切り刻み、およびその他の 調整方法に関する説明と、 他の人のコードの振る舞いを変えることなく自分のコードの振る舞いを変えるための、 範囲的な変更を提供する方法を含むようになりました。

INSTALL で Perl が C89 コンパイラが必要であることを明示的に宣言しました

これは既に真でしたが、記録として公式に表明しました (5.12.2)。

\xHH エスケープと \oOOO エスケープの説明

perlop はこれら二つの文字エスケープに関するより詳細な説明で 更新されました。

-0NNN オプション

perlrun において、-0NNN オプションのうち -0400 以上のものの 振る舞いが明確化されました (5.12.2)。

メンテナンスポリシー

perlpolicy に、メンテナンスブランチにどのようなパッチが受け入れられるかに ついてのポリシーが追加されました (5.12.1)。

非推奨ポリシー

perlpolicy に、「非推奨」("deprecation") のような言葉の定義とともに、 互換性と非推奨に関するポリシーが追加されました (5.12.2)。

perldiag の新しい記述

以下の示す、既存の診断メッセージが文書化されました:

perlbook

perlbook はより多くの有名な書籍を対象とするように拡張されました。

SvTRUE マクロ

perlapi にある SvTRUE マクロの説明は get-magic が処理されないという 説明が単純に間違っていました。 これは修正されました。

op 操作関数

op 木を処理するためのいくつかの API 関数が新たに文書化されました。

perlvar の刷新

perlvar は、変数の順序を変えて、主題毎にグループ化しました。 Perl 5.000 以降に導入された変数はそれぞれ利用可能になったバージョンを 記しています。 perlvar は、非推奨の変数がいつ削除されたかを記すための新しい節が 追加されました。

スカラコンテキストでの配列とハッシュのスライス

これらは perldata で文書化されました。

use locale とフォーマット

perlformperllocale は、use locale がフォーマットに与える 影響を述べるように修正されました。

overload

overload の文書はほとんど書き直されました。 はるかに直接的で明確になりました。

perlhack と perlrepository の刷新

perlhack 文書はとても短くなり、Perl 5 開発プロセスと Perl への パッチの投稿に焦点を当てています。 技術的な内容は新しい文書である perlsource, perlinterp, perlhacktut, perlhacktips に移動しました。 技術的な内容は軽く編集されただけです。

perlrepository 文書は perlgit に名前が変わりました。 この新しい文書は単に git で Perl ソースコードを扱うための手引き書です。 perlrepository にあったその他の内容は perlhack に移動しました。

Time::Piece の例

perlfaq4 の例が Time::Piece の使い方を示すように更新されました。


診断メッセージ

以下の追加や変更が、警告や致命的エラーメッセージ含む診断出力に行われました。 完全な診断メッセージの一覧については、perldiag を参照してください。

新しい診断メッセージ

新しいエラー

Closure prototype called

このエラーは、属性ハンドラに渡されたサブルーチンのリファレンスが 呼び出されたとき、そのサブルーチンがクロージャだったときに起こります [perl #68560]。

Insecure user-defined property %s

Perl は、ユーザー定義文字特性関数 (\p{IsFoo}\p{InFoo}) の 呼び出しを含む正規表現をコンパイルしようとしたときに汚染されているデータを 検出しました。 perlunicode/User-Defined Character Propertiesperlsec を 参照してください。

panic: gp_free failed to free glob pointer - something is repeatedly re-creating entries

この新しいエラーは、新しいエントリを含むオブジェクトを作る デストラクタのオブジェクトを含む新しい型グロブを作る解放された 型グロブの中のオブジェクトのデストラクタ、といったものが 呼び出されたときに起こります。

Parsing code internal error (%s)

この新しい致命的エラーは、エクステンションによって供給されたパースコードが 検知できる方法でパーサの API に違反しているときに発生します。

refcnt: fd %d%s

この新しいエラーは、パイプを閉じようとしているときに内部の一貫性チェックに 失敗したときにのみ発生します。

Regexp modifier "/%c" may not appear twice

正規表現パターンに、相互に排他な修飾子の一つが繰り返されています。

Regexp modifiers "/%c" and "/%c" are mutually exclusive

正規表現パターンに、相互に排他な修飾子が複数あります。

Using !~ with %s doesn't make sense

このエラーは、!~s///ry///r で使われたときに起こります。

新しい警告

"\b{" is deprecated; use "\b\{" instead
"\B{" is deprecated; use "\B\{" instead

エスケープされていない "{" の直後に \b または \B を使うことは、 Perl 自身の将来のリリースでの使用を予約するために非推奨となりました。

Operation "%s" returns its argument for ...

Unicode サロゲートや非 Unicode 文字に対して (大文字小文字の畳み込みのような) Unicode の意味論 を要求する操作を実行すると、この警告が発生します。

Use of qw(...) as parentheses is deprecated

詳しくは、上述の かっことしての qw(...) の使用 を参照してください。

既存の診断メッセージの変更


ツールの変更

perlbug(1)

perl5db.pl

ptargrep


設定とコンパイル

上述の Policy_sh.SH の命名の修正によって Policy.sh が不正になりました も 参照してください。


プラットフォーム対応

新しいプラットフォーム

AIX

Perl を AIX 4.2 でビルドできるようになりました (5.12.1)。

中断したプラットフォーム

Apollo DomainOS

このプラットフォームの対応の最後の名残が Perl 配布から削除されました。 これはバージョン 5.12.0 で公式に中断されました。 それ以前何年も作業されていませんでした。

MacOS Classic

このプラットフォームの対応の最後の名残が Perl 配布から削除されました。 これはもっと前のバージョンで公式に中断されました。

プラットフォーム固有の注意

AIX

ARM

Cygwin

FreeBSD 7

HP-UX

IRIX

Mac OS X

MirBSD

NetBSD

OpenBSD

OpenVOS

Solaris

VMS

Windows

上述の fork() エミュレーションはシグナルを送られた子プロセスを待ちませんWindows では Perl ソースコードをテキストモードで読み込みます も参照してください。


内部の変更

新しい API

正しいスレッド作成を容易にするために CLONE_PARAMS 構造体が追加されました

スレッドを作成するモジュールは、新しい関数である Perl_clone_params_new() を 呼び出すことで CLONE_PARAMS 構造体を作成し、Perl_clone_params_del() で 解放するようになりました。 これにより、将来 CLONE_PARAMS の内部配置が変更されたときの互換性を 確保して、正しく割り当てと初期化が行われるようにします。

新しいパース関数

文や式のパースのためのいくつかの関数が追加されました: これらの関数は、Perl のパース中に再帰下降の方式で XS コードによって起動され、 モジュールが標準 Perl 文法を拡張できるようにします。

ヒントハッシュ API

ヒントハッシュ %^H を実行時に内部調査するための新しい C API が 追加されました。 詳しくは perlapicop_hints_2hv, cop_hints_fetchpvn, cop_hints_fetchpvs, cop_hints_fetchsv, hv_copy_hints_hv を 参照してください。

Perl が %^H のために使う内部構造にアクセスするための新しい実験的な API が追加されました。 perlapi の、cophh_ で始まる関数を参照してください。

caller() への C インターフェース

caller_cx 関数は、XSUB-作者のための caller() の等価物として追加されました。 詳しくは perlapi を参照してください。

サブルーチン毎のカスタムチェックフック

エクステンションモジュールの XS コードはサブルーチンに (XS で 実装されているか Perl で実装されているか) のアノテーションが 付けられるようになったので、任命された XS コードはそのサブルーチンの op 木を変更するためにコンパイル時 (具体的には op チェックの一部として) 呼び出されます。 (エクステンションモジュールによって供給される) コンパイル時のチェック関数は プロトタイプとして記述できない引数処理の実装、カスタマイズされた コンパイル時警告の生成、純粋な関数のための定数の畳み込みの実行、 充分に単純な op からなるサブルーチンのインライン化、呼び出し全体の カスタム op への置き換えなどが可能です。 以前はこれは全て entersub op チェッカをフックすることで可能でしたが、 新しい機構は簡単にフックを特定のサブルーチンに結びつけることができます。 perlapi/cv_set_call_checker を参照してください。

カスタムチェックフックを書くのを助けるために、標準の entersub op チェックに あるいくつかの副タスクが分離され、API に露出しました。

カスタム op への改良された対応

カスタム ops は新しい custom_op_register C 関数と XOP 構造体で 登録できるようになりました。 これにより、将来カスタム op の新しいプロパティをより簡単に 追加できるようになります。 二つの新しいプロパティである xop_classxop_peep が既に 追加されています。

xop_class は OA_*OP 定数の一つです。 これにより、B やその他の内部検査機構が BASEOP でないカスタム op で 動作するようになります。 xop_peep は、Perl_rpeep からこの種類の op を呼び出す関数への ポインタです。

さらなる詳細については perlguts/Custom Operatorsperlapi/Custom Operators を参照してください。

古い PL_custom_op_names/PL_custom_op_descs インターフェースもまだ 対応していますが、勧められません。

スコープフック

新しい Perl_blockhook_register 関数を使って、コンパイル時の Perl の レキシカルスコープ機構にフックする XS コードが可能になりました。 perlguts/"Compile-time scope hooks" を参照してください。

覗き穴最適化器の再帰部分がフック可能になりました

PL_peepp に加えて、トップレベル覗き穴最適化器をフックするために、 op 木の再度チェーンへの再帰する最適化器へフックするための PL_rpeepp が利用可能になりました。

既存の関数の新しい非マジカル版

以下の関数/マクロが API に追加されました。 *_nomg マクロは _nomg なし版と等価ですが、get-magic を無視します。 _flags で終わっているものは、get-magic を処理するかどうかを 指定できます。

  sv_2bool_flags
  SvTRUE_nomg
  sv_2nv_flags
  SvNV_nomg
  sv_cmp_flags
  sv_cmp_locale_flags
  sv_eq_flags
  sv_collxfrm_flags

これらのケースのいくつかでは、非-_flags 関数は新しい関数の ラッパーと置き換えられました。

既存の関数のpv/pvs/sv 版

末尾に pvn が付く多くの関数に、等価な pv/pvs/sv 版が追加されました。

リスト op 構築関数

リスト op 構築関数が API に追加されました。 perlapiop_append_elem, op_append_list, op_prepend_elem を参照してください。

LINKLIST

実行順 op チェーンを構成する op 構築の一部である LINKLIST マクロが追加されました。

ローカル化関数

save_freeop, save_op, save_pushi32ptr, save_pushptrptr 関数が API に追加されました。

スタッシュ名

スタッシュは、通常の名前に追加して、有向な名前のリストを持つように なりました。 最初の有効な名前は HvENAME マクロ経由でアクセスでき、これは MRO 線形化で使う推奨される名前となりました (HvENAME がない場合は HvNAME にフォールバックします)。

これらの名前は hv_ename_addhv_ename_delete を使って追加および 削除されます。 これら二つの関数は API の一部では ありません

マジックの検索と削除のための新しい関数

mg_findext() 関数と sv_unmagicext() 関数が API に追加されました。 これらはエクステンションの作者がマジックの種類およびマジックの仮想テーブルを 基に、スカラに付加されているマジックを探したり削除したりできるようにします; sv_magicext() が特定の種類と与えられた仮想テーブルのマジックをスカラに 付与する方法と同様です。 これにより、SV に付与されているマジックを探すために、エクステンションが その MAGIC ポインタを辿る必要をなくします。

find_rundefsv

この関数は、レキシカルであろうと動的であろうと、$_ を表現する SV を返します。

Perl_croak_no_modify

Perl_croak_no_modify()Perl_croak("%s", PL_no_modify) の 簡略形です。

PERL_STATIC_INLINE 定義

C コンパイラが C99 形式の静的インライン関数に対応している場合、 静的インライン関数を使うような指示を提供する、 PERL_STATIC_INLINE 定義が追加されました。 対応していない場合は、普通の static を返します。

HAS_STATIC_INLINE はコンパイラが実際にインライン関数に対応しているか どうかをチェックするのに使えます。

16 進エスケープのための新しい pv_escape オプション

pv_escape に、ASCII 以上の全ての文字を 16 進数でダンプする PERL_PV_ESCAPE_NONASCII オプションが新しく追加されました。 以前は、全ての文字を 16 進数にするか、Latin1 非-ASCII を 8 進数にするか でした。

lex_start

lex_start が API に追加されましたが、実験的なものと考えられています。

op_scope()op_lvalue()

op_scope() 関数と op_lvalue() 関数が API に追加されましたが、実験的なものと 考えられています。

C API の変更

PERL_POLLUTE は削除されました

後方互換性のために古い 5.005 のシンボルを露出させるための PERL_POLLUTE を定義するオプションは削除されました。 この使用は常に勧められず、 MakeMaker はより具体的な回避方法を持っています:

    perl Makefile.PL POLLUTE=1

これは、まだ 5.6 命名規約に更新されていない (そして今では完全に 古いものである) モジュールで使えます。

XS モジュールを読み込むときのチェック API の互換性

Perl の API が互換性のない形で変更されたとき (普通はメジャーリリース間で 起こります)、以前のバージョンの Perl 用にコンパイルされた XS モジュールは もはや動作しなくなります。 新しい Perl 用に再コンパイルする必要があります。

XS_APIVERSION_BOOTCHECK マクロは、確実にモジュールが再コンパイルされて、 ユーザーが間違って古い perl 用にコンパイルされたモジュールを新しい perl で 読み込むのを防ぐために追加されました。 新しくコンパイルされたエクステンションが読み込まれる度に呼び出される このマクロは、実行中の perl の API のバージョンと、モジュールのコンパイルされた バージョンを比較し、それが一致しなければ例外を発生させます。

Perl_fetch_cop_label

C API 関数 Perl_fetch_cop_label の第 1 引数は、ユーザーから実装詳細を 分離するために、struct refcounted_he * から COP * に変更されました。

この API 関数は「変更されるかもしれない」という印が付けられ、 コアの外で使われることはなさそうです。 (CPAN を展開したものや Google コードサーチではこれを参照しているものは 見つかりませんでした。)

GvCV()GvGP() はもはや左辺値ではありません

新しい GvCV_set() マクロと GvGP_set() マクロがこれら二つのマクロへの 代入の代替として提供されています。

これにより、gp_cv スロットへの代入を完全に制御するのに必要な、 GV と CV の間の後方参照マジックを取り除くためのコミットが将来 出来るようになります。

CvGV() はもはや左辺値ではありません

ある種の状況では、CV の CvGV() フィールドは参照カウントされます。 一貫性のある振る舞いを保証するために、例えば CvGV(cv) = gv のような 直接の代入はコンパイルエラーになります。 新しいマクロである CvGV_set(cv,gv) が、この操作を安全に行うために 導入されました。 この新しいマクロにも関わらず(そしてこの節に書いているにも関わらず) このフィールドの変更は公式 API の一部ではないことに注意してください。

CvSTASH() はもはや左辺値ではありません

CvSTASH() マクロは右辺値としてのみ使えるようになりました。 CvSTASH_set() が、CvSTASH() への代入の代わりとして追加されました。 これは、バックリファレンスが正しく扱われるのを保証するためです。 これらのマクロは API の一部ではありません。

newFOROPnewWHILEOP の呼び出し規約

パーサがラベルを扱う方法が整理され、リファクタリングされました。 結果として、newFOROP() コンストラクタ関数は、もはやどのラベルが状態に 入るかを示す引数を取らなくなりました。

newWHILEOP() 関数と newFOROP() 関数はもはや行番号を引数として 受け付けなくなりました。

uvuni_to_utf8_flagsutf8n_to_uvuni に渡されるフラグ

uvuni_to_utf8_flags() と utf8n_to_uvuni() へのフラグ引数の一部が 変更されました。 これは、ある種の状況で問題となる符号位置の内部保管と操作が可能になった 結果です。 従って、これらの関数のデフォルトアクションはこれらの符号位置を認めるように 補完されました。 新しいフラグは perlapi で文書化されています。 問題のある符号位置を拒絶することが必要なコードは、この新しいフラグを 使うように変更する必要があります。 一部のフラグ名は後方ソース互換性のために保持していますが、何もしません; 今ではデフォルトとなっています。 しかし UNICODE_ALLOW_FDD0, UNICODE_ALLOW_FFFF, UNICODE_ILLEGAL, UNICODE_IS_ILLEGAL は削除されました; perlunicode/Non-character code points に記述されているように、 Unicode 非文字符号位置をどう扱うべきかに関して本質的に壊れたモデルに 基づくものだからです。 バグ修正の抜粋 の Unicode の節も参照してください。

非推奨の C API

Perl_ptr_table_clear

Perl_ptr_table_clear はもはや Perl の公式 API の一部ではありません。 これを呼び出すと非推奨警告が生成され、将来のリリースで削除されます。

sv_compile_2op

sv_compile_2op() API 関数は非推奨となりました。 検索した結果 CPAN にこれを使っているものはありませんでしたので、 これの影響はないはずです。

これは op 木へのコードをコンパイルするための API を提供しようとしましたが、 囲まれたスコープ内のレキシカルに対して正しく結びつけることに失敗していました。 引数と返り値の制限の中でこの問題を修正することは不可能です。

find_rundefsvoffset

find_rundefsvoffset 関数は非推奨となりました。 この設計は、確実に実行時にレキシカルな $_ を得るには不十分と思われます。

代わりに、新しい find_rundefsv 関数か UNDERBAR マクロを使ってください。 これらはレキシカルか動的かに関わらず、 $_ を表現する正しい SV を 直接返します。

CALL_FPTR and CPERLscope

これらは Perl 5.8 で削除された、C++ オブジェクトを使った MULTIPLICITY の 古い実装から残されていました。 今ではこれらのマクロは全く何もしないので、もう使うべきではありません。

互換性のために、これらはまだ外部 XS コードのために定義されています。 PERL_CORE を定義しているエクステンションだけが今回 更新しなければなりません。

その他の内部の変更

スタックの巻き戻し

die の最終ステージの C スタックの巻き戻しのための手順は、どのように ターゲットスタックフレームを識別するかが変更されました。 今では別の変数 PL_restartjmpenv を使うようになりました; 以前は 名目上捨てられた eval コンテキストフレームにある blk_eval.cur_top_env ポインタに依存していました。 この変更は、Perl レベルの巻き戻しのさまざまなステージで実行中の コードが、もはや幽霊フレームを破壊することを避けるために気をつかう 必要はありません。

スコープスタックエントリ

スコープスタックのエントリの形式が変更され、結果としてメモリ消費が約 10 % 減少しました。 特に、それぞれのアクティブなレキシカル変数を記録するためのスコープスタックで 使われるメモリは半分になりました。

ポインタテーブルのためのメモリ割り当て

ポインタテーブルのためのメモリ割り当てが変更されました。 以前は Perl_ptr_table_storeSV ボディおよび HE と同じ領域から メモリを割り当て、解放されたメモリはインタプリタが終了するまでその領域に 残っていました。 今では特定のポインタテーブル専用の領域からメモリを割り当てられ、このメモリは Perl_ptr_table_free が呼び出されるとシステムに返されます。 さらに、割り当てと解放は両方とも CPU パワーを使わなくなります。

UNDERBAR

UNDERBAR マクロは find_rundefsv を呼び出すようになりました。 dUNDERBAR は何もしなくなりましたが、過去と将来の互換性のために まだ残されています。

文字列比較ルーチンの名前が変わりました

ibcmp_* 関数は名前が変わり、foldEQ, foldEQ_locale, foldEQ_utf8 と呼ばれます。 古い名前もまだマクロとして利用可能です。

chopchomp の実装がマージされました

chop および chomp のオペコードボディと schop および schomp の オペコードボディがマージされました。 実装関数である Perl_do_chop()Perl_do_chomp() (公式 API ではありません) は マージされ、pp.c の静的関数として移動しました。 これにより Perl バイナリが少し小さくなり、(chomplist の値を 渡されたときの副作用の順序に依存していない限り) コアの外側のコードには 一切影響を与えないはずです。


バグ修正の抜粋

I/O

正規表現のバグ修正

文法/パースバグ

スタッシュ、グロブ、メソッド検索

Perl 5.10.0 では、メソッド検索をより速くするために MRO キャッシュする (メソッド解決順序、つまり親クラスのリスト; またの名を "isa" キャッシュ) ための新しい内部機構が導入されました (これにより @ISA が繰り返し検索する 必要がなくなりました)。 残念ながら、これにはいくつかバグがありました。 そのほとんどは、5.10.0 以前からあった MRO 関係のバグと共に、 今では修正されました:

さらに、型グロブとスタッシュに関する様々なその他のバグが修正されました:

Unicode

tie、オーバーロードおよびその他のマジック

デバッガ

スレッド

スコープとサブルーチン

シグナル

さまざまなメモリリーク

メモリ破壊とクラッシュ

様々な Perl 演算子への修正

C API に関連するバグ


既知の問題

これは、以前のバージョンの Perl からの退行や、広く使われている CPAN モジュールに影響する、重要な未解決問題の一覧です。


正誤表

keys(), values(), each() は配列でも動作します

keys(), values(), each() 組み込み関数を配列に対しても使えるように なりました(以前はハッシュに対してしか使えませんでした)。 詳しくは perlfunc を参照してください。 これは実際には perl 5.12.0 で導入されましたが、このリリースの perl5120delta から漏れていました。

split()@_

split() はスカラコンテキストや無効コンテキストで呼び出されたときに @_ を変更されなくなりました。 無効コンテキストでは "Useless use of split" 警告が出ます。 これは perl 5.12.0 でも変更されていましたが、perldelta から漏れていました。


追悼

http://kobesearch.cpan.org/ の作者であり、いくつかのコア Perl ツールチェーンモジュールの貢献者/メンテナである Randy Kobes は肺がんとの闘病の末に 2010 年 9 月 18 日に亡くなりました。 コミュニティは彼の関与によってより豊かになりました。 Perl コミュニティへの彼の貢献は忘れません。 彼は残念なことでした。


Acknowledgements

Perl 5.14.0 は、Perl 5.12.0 以降、150 人の作者とコミッタによって、 約 3,000 のファイルに 550,000 行以上の変更を加えて、 ほぼ 1 年間開発されてきました。

Perl は、活気のあるユーザーと開発者のコミュニティのおかげで 20 年を超えて繁栄しています。 以下の人々が、Perl 5.14.0 になるための改良に貢献したことが 分かっています:

Aaron Crane, Abhijit Menon-Sen, Abigail, Ævar Arnfjörð Bjarmason, Alastair Douglas, Alexander Alekseev, Alexander Hartmaier, Alexandr Ciornii, Alex Davies, Alex Vandiver, Ali Polatel, Allen Smith, Andreas König, Andrew Rodland, Andy Armstrong, Andy Dougherty, Aristotle Pagaltzis, Arkturuz, Arvan, A. Sinan Unur, Ben Morrow, Bo Lindbergh, Boris Ratner, Brad Gilbert, Bram, brian d foy, Brian Phillips, Casey West, Charles Bailey, Chas. Owens, Chip Salzenberg, Chris 'BinGOs' Williams, chromatic, Craig A. Berry, Curtis Jewell, Dagfinn Ilmari Mannsåker, Dan Dascalescu, Dave Rolsky, David Caldwell, David Cantrell, David Golden, David Leadbeater, David Mitchell, David Wheeler, Eric Brine, Father Chrysostomos, Fingle Nark, Florian Ragwitz, Frank Wiegand, Franz Fasching, Gene Sullivan, George Greer, Gerard Goossen, Gisle Aas, Goro Fuji, Grant McLean, gregor herrmann, H.Merijn Brand, Hongwen Qiu, Hugo van der Sanden, Ian Goodacre, James E Keenan, James Mastros, Jan Dubois, Jay Hannah, Jerry D. Hedden, Jesse Vincent, Jim Cromie, Jirka Hruška, John Peacock, Joshua ben Jore, Joshua Pritikin, Karl Williamson, Kevin Ryde, kmx, Lars Dɪᴇᴄᴋᴏᴡ 迪拉斯, Larwan Berke, Leon Brocard, Leon Timmermans, Lubomir Rintel, Lukas Mai, Maik Hentsche, Marty Pauley, Marvin Humphrey, Matt Johnson, Matt S Trout, Max Maischein, Michael Breen, Michael Fig, Michael G Schwern, Michael Parker, Michael Stevens, Michael Witten, Mike Kelly, Moritz Lenz, Nicholas Clark, Nick Cleaton, Nick Johnston, Nicolas Kaiser, Niko Tyni, Noirin Shirley, Nuno Carvalho, Paul Evans, Paul Green, Paul Johnson, Paul Marquess, Peter J. Holzer, Peter John Acklam, Peter Martini, Philippe Bruhat (BooK), Piotr Fusik, Rafael Garcia-Suarez, Rainer Tammer, Reini Urban, Renee Baecker, Ricardo Signes, Richard Möhn, Richard Soderberg, Rob Hoelz, Robin Barker, Ruslan Zakirov, Salvador Fandiño, Salvador Ortiz Garcia, Shlomi Fish, Sinan Unur, Sisyphus, Slaven Rezic, Steffen Müller, Steve Hay, Steven Schubiger, Steve Peters, Sullivan Beck, Tatsuhiko Miyagawa, Tim Bunce, Todd Rinaldo, Tom Christiansen, Tom Hukins, Tony Cook, Tye McQueen, Vadim Konovalov, Vernon Lyon, Vincent Pit, Walt Mankowski, Wolfram Humann, Yves Orton, Zefram, and Zsbán Ambrus.

これはバージョンコントロール履歴から自動的に生成しているので、 悲惨なほどに不完全です。 特に、Perl 5.14.0 をよりよくするための助けとなった、以前のバージョンの Perl の問題を報告してくれた(とてもありがたい)貢献者の名前を含んでいません。 全ての Perl の歴史的な貢献者のより完全な一覧はについては、 どうか Perl 5.14.0 配布に含まれている AUTHORS を参照してください。

このバージョンに含まれている変更の多くは、Perl コアに含まれている CPAN モジュール由来のものです。 私たちは Perl が繁栄するのを助けている CPAN コミュニティ全体に感謝します。


バグ報告

もしバグと思われるものを見つけたら、comp.lang.perl.misc ニュースグループに 最近投稿された記事や http://rt.perl.org/perlbug/ にある Perl バグ データベースを確認してください。 Perl ホームページ、http://www.perl.org にも情報があります。

もしまだ報告されていないバグだと確信したら、そのリリースに含まれている perlbug プログラムを実行してください。 バグの再現スクリプトを十分小さく、しかし有効なコードに切りつめることを 意識してください。バグレポートは perl -V の出力と一緒に perlbug@perl.org に送られ Perl porting チームによって解析されます。

もし報告しようとしているバグがセキュリティに関するもので、公開されている メーリングリストに送るのが不適切なものなら、 perl5-security-report@perl.org に送ってください。 このアドレスは、問題の影響を評価し、解決法を見つけ、Perl が対応している 全てのプラットフォームで問題を軽減または解決するパッチをリリースするのを 助けることが出来る、全てのコアコミッタが参加している非公開の メーリングリストになっています。 このアドレスは、独自に CPAN で配布されているモジュールではなく、 Perl コアのセキュリティ問題だけに使ってください。


SEE ALSO

変更点の完全な詳細を見る方法については Changes ファイル。

Perl のビルド方法については INSTALL ファイル。

一般的なことについては README ファイル。

著作権情報については Artistic 及び Copying ファイル。