package NAME VERSION
文法...
演算子\N
configure_requires
への対応each
がより柔軟にwhen
$,
の柔軟性delete local
perl5120delta - perl v5.12.0 での変更点
このドキュメントは 5.10.0 リリースと 5.12.0 リリースの変更点を記述しています。
5.12.0 でのバグ修正の多くは既に 5.10.1 メンテナンスリリースに含まれています。
これらの変更の一覧は 5.10.1 リリースノート (perl5101delta) で 見られます。
package NAME VERSION
文法名前空間が 'package' で宣言されるとき、モジュール作者が名前空間の $VERSION をセットするための新しい文法が使えるようになりました。 これによって、for our $VERSION = ...
や似たような構造を取り除けます。 例えば、
package Foo::Bar 1.23;
# $Foo::Bar::VERSION == 1.23
これにはいくつかの利点があります:
$VERSION
は use NAME VERSION
と全く同じようにパースされます
$VERSION
はコンパイル時にセットされます
$VERSION
は、比較演算子を適切にオーバーロードしたバージョン オブジェクトなので、$VERSION
と、数値形式 (1.23) や ドット区切り数値形式 (v1.2.3) のバージョン番号を正しく比較できます。
$VERSION = ...
と eval $VERSION
といった乱雑なものを除去します
VERSION として数値リテラルかv-文字列リテラルが必要なので、 MM->parse_version が $VERSION = ...
に対して行っているような eval
なしに、ツールチェーンモジュールが静的にパースできます。
これは package NAME
とだけ書いてある古いコードは壊しませんが、 package NAME VERSION
を使っているコードは perl 5.12.0 以降では制限される 必要があります。 これは open
の 2 引数から 3 引数への変更に似ています。 最新の Perl が必要なユーザーには利益があり、おそらく数年後には 標準的なプラクティスになっているでしょう。
しかし、package NAME VERSION
は新しい「厳密な」バージョン番号形式を 必要とします。 詳細については "Version number formats" を参照してください。
...
演算子ヤダヤダ演算子というあだ名のある新しい演算子 ...
が追加されました。 これはまだ実装していないコードのプレースホルダとしてマークすることを 目的としています。 "Yada Yada Operator" in perlop を参照してください。
バージョン番号 5.11.0 以上を指定した use VERSION
文法を使うと、 (その他の機能が有効化されるのに追加して) ちょうど use strict
と同様、レキシカルに strict が有効になります。 以下の表記は:
use 5.12.0;
以下を意味します:
use strict;
use feature ':5.12';
Perl 5.12 は、リリース時点での最新版である Unicode 5.2 を同梱しています。 この版の Unicode は 2009 年 10 月にリリースされました。 この版の標準で変更されたものに関するさらなる詳細については http://www.unicode.org/versions/Unicode5.2.0 を参照してください。 他の版の Unicode をインストールして使うための方法については perlunicode を参照してください。
さらに、Perl の開発者は Perl の Unicode 実装を大きく改善しました。 完全な詳細については、後述する "Unicode overhaul" を参照してください。
Perl コアの時刻関係の関数は 2038年問題準拠になりました。 (これはあなたにとっては余り意味のないことかもしれませんが、 あなたの子供はこれを喜ぶでしょう!)
qr//
operator 演算子をオーバーロードできるようになりました; これは正規表現への変換で、既に可能であった真偽値、文字列、数値の オブジェクトへの変換と似たものです。 これは、オブジェクトが =~
演算子の右側に現れたときか、 正規表現への変数展開が行われるときに起動します。 overload を参照してください。
エクステンションモジュールは、キーワードが頭についた表現と複合文の 新種を定義するために、Perl のパーサーにきれいにフックを設定できます。 キーワードに引き続く文法は完全にエクステンションによって定義されます。 これにより、インラインでパースでき、正しい ops をきれいに生成できる、 完全に Perl とは違う副言語が可能になります。
仕組みについては "PL_keyword_plugin" in perlapi を参照してください。 Perl コアソース配布には、プラグ可能なキーワードを使って逆ポーランド記法を 実装した XS::APItest::KeywordRPN という新しいモジュールも含んでいます。 このモジュールは主にテスト用に使われ、通常はインストールされませんが、 この仕組みの使い方の例となっています。
Perl の開発者はこの機能は実験的なものだと考えています。 Perl 5.14 では過去互換性の点から削除したり変更したりするかもしれません。
字句解析の最下位層とパッドシステムの一部が XS エクステンションから 利用可能な C API を持つようになりました。 これらはプラグ可能なキーワードの適切な使用を助けるために必要ですが、 他の使い方もあります。 新しい API は実験的で、これらの分野のコアの能力の利点を完全に 利用するために必要なもののうち小さな部分しか対応していません。 Perl 5.13 開発サイクルでクリーンで対応したインターフェースを完全に 追加することを目的としています。
Perl の開発者はこの機能は実験的なものだと考えています。 Perl 5.14 では過去互換性の点から削除したり変更したりするかもしれません。
エクステンションモジュールがサブルーチン検索処理を修正するために rv2cv op の作成をフックした場合、 これは裸のサブルーチン呼び出しでも正しく動作するようになりました。 これは、この方法で参照されたサブルーチンのプロトタイプが正しく 処理されることを意味します。 (以前は、裸のサブルーチン名はフックできない機構を使ってパースのために 最初に検索されていたので、エクステンションは &
がついている サブルーチン名しか適切に影響を与えられませんでした。)
Perl 5.10.1 から、デフォルト (線形深さ優先検索) 以外のメソッド解決順序を 追加して使うための新しいインターフェースがあります。 5.10.0 で追加された C3 メソッド解決順序は、Perl 空間でのインターフェースの 変更なしにプラグインとして再実装されました。 さらなる情報については perlmroapi を参照してください。
\N
\n
の逆と考えられる新しい正規表現エスケープである \N
に 対応しました。 これは、単一行マッチング修飾子 /s
のあるなしに関わらず、 改行以外の任意の文字にマッチングします。 これは文字クラスの中では使えません。 \N{3}
は改行でない 3 文字にマッチングします; \N{5,}
は少なくとも 5 文字にマッチングします。 \N{NAME}
は未だ NAME
という名前の文字またはシーケンスを意味しますが、 NAME
として 3
や 5,
といったものは使えなくなりました。
これは、文字名として数値も許していた カスタム文字名変換器 を壊します; なぜなら \N{3}
は三つの非改行文字にマッチングし、3
という名前の 文字ではなくなるからです。 (Unicode 標準で定義されている名前には数字はありません; カスタム変換器のみが影響を受けます。)
Perl の開発者は、ユーザーが、その Unicode 名の文字とマッチングする 既存の \N{...}
構造と混乱することを懸念しています。 従って、この機能は実験的なものです。 Perl 5.14 では過去互換性の点から削除したり変更したりするかもしれません。
DTrace へのいくらかの対応が追加されました。 INSTALL の "DTrace support" を参照してください。
configure_requires
への対応CPAN
と CPANPLUS
は、ほとんどの最近の CPAN 配布が含んでいる メタデータファイル META.yml の configure_requires
キーワードに 対応しました。 これにより、Makefile.PL や Build.PL が実行される前に インストールされていなければならない設定の事前条件を指定できます。
CPAN で配布するときに configure_requires
を指定する方法については ExtUtils::MakeMaker
か Module::Build
の文書を参照してください。
each
がより柔軟にeach
関数は配列を操作できるようになりました。
when
when
は文修飾子として使えるようになりました。
$,
の柔軟性$,
変数を tie できるようになりました。
// は when 句では || のように振る舞うようになりました。
PERL5OPT
環境変数で -W
をセットできるようになりました。
delete local
delete local
でハッシュエントリをローカルに削除できるようになりました。
抽象名前空間ソケットは、AF_UNIX ファミリーにある Linux 固有のソケット型で、 任意の文字配列をアドレスとして使えるようにやや悪用されています: これは NUL バイトから始まって、NUL バイトでは終わりませんが、 socket() システムコールで渡される長さがあります。
substr
の引数の 32 ビット制限は取り除かれました。 pos
引数と len
引数として、 システムの符号付き整数および符号なし整数の幅全てを指定可能です。
長年をかけて、Perl の開発者は多くの言語機能を様々な理由で非推奨に してきました。 Perl は、非推奨の言語機能が使われると警告を出すのがデフォルトになりました。 Perl が警告するようになった非推奨の多くは何年間も非推奨となっています。 Perl のあるリリースで何が非推奨かの一覧はそのリリースの perl5xxdelta.pod
ファイルにあります。
レキシカルスコープでこの機能を無効にするには、 no warnings 'deprecated';
を使ってください。 どの言語機能が非推奨であるかと、様々な非推奨警告の説明については、 perldiag を参照してください。 Perl の開発者がこのリリースで非推奨とした機能とモジュールの一覧は 以下の "Deprecations" を参照してください。
受け付けられるバージョン番号形式は、「厳密な」形式と「曖昧な」形式で 形式化されました。 package NAME VERSION
は厳密なバージョン番号を取ります。 UNIVERSAL::VERSION
と version オブジェクトコンストラクタは 曖昧なバージョン番号を取ります。 バージョンが不正な場合、致命的エラーになります。 use NAME VERSION
のバージョン引数はまず数値リテラルかv-文字列として パースされ、それから UNIVERSAL::VERSION
に渡されます (そして「曖昧な」形式テストを通過する必要があります)。
これらの形式は version に完全に文書化されています。 最初の仮定として「厳密な」バージョン番号は指数部のない正の 10 進数 (整数か 10 進小数) か、あるいは先頭に 'v' の文字がついたドット付き 10 進数整数v-文字列で、少なくとも3 要素があるものです。 「曖昧な」バージョン番号は、要素数が 2 以下であったり、先頭に 'v' が ないものも許します。 「曖昧な」規則の下では、10 進数とドット付き 10 進数のバージョンは、 小数かドット付き要素の後に下線で区切られた「英字」要素を 付けることができます。
version モジュールには、スカラがこれらの形式に従っているかを チェックするための version::is_strict
関数と version::is_lax
関数が 追加されました。
@INC
の中で、ARCHLIB
と PRIVLIB
は現在のバージョンの site_perl
および vendor_perl
の後に現れるようになりました。 site_perl
と vendor_perl
にインストールされたモジュールは、 ARCHLIB
や PRIVLIB
にインストールされたものより優先して 読み込まれます。
内部では、Perl は(qr//
で作成されたような)コンパイルされた正規表現を を第一級実体として扱います。 Perl の内部データ構造を直列化、非直列化するなどの深い相互作用を 行うモジュールは、この変更に対応するために更新する必要があります。 影響の受ける CPAN モジュールのほとんどは、これを書いている時点で 既に更新されています。
given
/when
の switch 文は、Perl 5.10.0 で扱えたものよりも もっと複雑な文を扱えるようになりました (これらの拡張は 5.10.1 および引き続く 5.10 リリースでも利用可能です。) 新しく、when
がスマートマッチングの式ではなく真偽値として 引数を解釈する場合が二つあります。
..
と ...
のフリップフロップ演算子は、通常の文法に従ってブール値 コンテキストで評価されるようになりました。 "Range Operators" in perlop を参照してください。
perl 5.10.0 では、when (1..10)
としても、与えられた値が 1 から 10 の間の 数値かどうかをテストするようには動作しないことに注意してください; 代わりに when ([1..10])
を使うべきです (配列リファレンスに 注意してください)。
しかし、5.10.0 とは反対に、when()
でブール値コンテキストで フリップフロップ演算子が評価されることが保証されることで、 特に以下のように双安定条件を実装するときに便利です:
when (/^=begin/ .. /^=end/) {
# do something
}
when (expr1 // expr2)
のような、定義性和 (defined-or) を含む複合式は、 最初の式が真偽値なら真偽値として扱われます。 (これは単に、when (expr1 || expr2)
のような通常の or 演算子に 適用されるすでにあるルールの拡張です。
Perl 5.10.0 から、Perl の開発者はスマートマッチング演算子に多くの変更を 行いました。 これらは、当然ながら暗黙にスマートマッチングを使っている switch 文の 振る舞いも変えます。 これらの変更は 5.10.1 にも適用され、引き続く 5.10 リリースにも残る予定です。
スマートマッチング演算子 ~~
はもはや可換性を持ちません。 スマートマッチングの振る舞いは、まず右側の引数の型に依存します。 さらに、その文法は一貫性と有用性をより高めるために調整されました。 一般的な後方互換性は維持されている一方、いくつかの変更点には 注意しなければなりません:
空のプロトタイプを持つコードリファレンスは特別扱いされなくなりました。 (たとえ無視されることになるとしても)これらはその他のコードリファレンスと同様に 引数として渡されます。
%hash ~~ sub {}
と @array ~~ sub {}
は、 ハッシュや配列全体をリファレンスとしてサブルーチンに渡すのではなく、 ハッシュのそれぞれのキー(または配列の要素)に対してサブルーチンが 真を返すかどうかをテストするようになりました。
可換性の破綻により、コードリファレンスは ~~
演算子の左側に 現れたときにはもはや特別扱いされず、普通のスカラと同じように扱われます。
undef ~~ %hash
は常に偽となります (なぜなら undef
はハッシュのキーとして 使えないからです)。 (perl 5.10.0 の場合のように)""
への暗黙の変換は行われません。
$scalar ~~ @array
は常に配列の要素に対してスマートマッチングを 分配するようになりました。 これは、もし @array の一つの要素が $scalar ~~ $element
で検証されれば 真となります。 これは、配列にあるスカラが含まれているかどうかをテストする古い振る舞いの 一般化です。
スマートマッチング演算子に関する完全な発行テーブルは "Smart matching in detail" in perlsyn にあります。
一番右の引数の型に依存するという発行ルールによれば、 演算子の右側にオブジェクトのオーバーロード ~~
が現れたとき、 オーバーロードルーチンは(3 番目の引数に真の値を設定して; overload を 参照してください) 常に呼び出されます。 しかし、オブジェクトが左側に現れたとき、オーバーロードルーチンは 一番右の引数が単純なスカラの場合にのみ呼び出されます。 これによって配列に対するスマートマッチングの分配性や 複合型(コードリファレンス、ハッシュ、正規表現)に対するその他の振る舞いは 壊れません。 従って、スマートマッチングのためのローバーロードルーチンの作者は ほとんどの場合、スカラの比較と、可能性があるなら文字列化のオーバーロードに 関してのみ心配する必要があります; その他の一般的な場合は 一貫性を持って自動的に扱われます。
~~
は、オーバーロードしていないオブジェクトに対して動作しなくなりました (オブジェクトの基礎となる構造に依存することを避けるためです)。 しかし、オブジェクトが文字列化か数値化演算子をオーバーロードしていて、 オーバーロードのフォールバックが有効の場合は、通常通りに使われます。)
多くの Unicode 特性の定義が、現在の Unicode 標準に合わせる形で 変更されました。 上述の "Unicode overhaul" に一覧があります。 この変更によって、古い定義を想定しているコードは動かなくなるかもしれません。
boolkeys op は hash op のグループに移動しました。 これはバイナリ互換性を壊します。
ファイルハンドルは常に IO::File
に bless されるようになります。
以前の振る舞いは、ファイルハンドルがメモリに読み込まれたときには FileHandle (空の代理クラス) に bless され、さもなければ IO::Handle
に bless されていました。
use feature :5.10*
の文法が少し変更されました。 さらなる情報については "Modules and Pragmata" を参照してください。
Perl 開発者は Perforce ではく git を使うようになりました。 これは活発にコアで作業する人々にとってのみ影響がある、純粋に内部の 変更のはずです。 しかし、変更の結果として、perl にも多少の変更が見られます。 例えば、perl -V
の出力の詳細の一部です。 さらなる情報については perlrepository を参照してください。
Test::Harness
2.x から 3.x へのアップグレードへの一部として、 実験的な Test::Harness::Straps
モジュールは取り除かれました。 さらなる詳細については "Modules and Pragmata" を参照してください。
ExtUtils::MakeMaker
のアップグレードの一部として、 ExtUtils::MakeMaker::bytes
と ExtUtils::MakeMaker::vmsish
の モジュールはこの配布から取り除かれました。
Module::CoreList
はもはや %:patchlevel
ハッシュを含まなくなりました。
length undef
は undef を返すようになりました。
非対応のプライベートな C API 関数は、Perl のパブリック API への 漏洩を防ぐために、"static" で宣言されるようになりました。
ブートストラップ処理に対応するために、miniperl は正規表現エンジンで UTF-8 対応なしでビルドされるようになりました。
これにより、PERL_UNICODE をセットして、UTF-8 ロケールでビルドが 完了するようになりました。 これなしではブートストラップに問題があり、まだビルドされていないので、 正規表現エンジンの UTF-8 コンポーネントを読み込めませんでした。
miniperl の @INC は -I...
のみに制限され、$ENV{PERL5LIB}
と ".
" は切り離されました。
"#line XXX"
指示子の後に空白か改行が必要になりました。
tie されたファイルハンドルに、EOF の種類を提供するメソッド EOF が 追加されました。
その他全てのフロー制御文とよりよく一致させるために、 foreach
は属性として使われなくなりました。
5.10.0 で非推奨となった Perl のコマンドラインオプション "-P" が 削除されました。
時々、Perl の開発者は、以前コア配布の一部として出荷した機能やモジュールを 非推奨とする必要があることに気付きます。 私たちは、Perl に過去互換性のない変更をすることで Perl のソフトウェアを ビルドしたり保守したりする開発者に引き起こす苦痛といらだちについて よくわかっています。 私たちがある機能や文法を非推奨にしたとき、それは簡単な 選択ではなかったということは間違いありません。 時には、ある機能や文法が、設計や実装がまずいことを発見して非推奨に することを選択します。 時には、他の機能に差し支えたり、性能上の問題を引き起こすのが理由です。 時には、理由はもっと複雑です。 可能であるなら、私たちは少なくとも 1 メジャーリリースの間 非推奨の機能を以前の形で開発者に利用可能なままにしています。 非推奨の機能が Perl を管理・拡張する私たちの能力を大きく 混乱させないうちは、私たちは機能を出来るだけ長くそのままにしようと しています。
以下のものは非推奨となりました:
suidperl
はもはや Perl の一部ではありません。 これは setuid 許可ビットを正しく扱えないシステムで、これを エミュレートする機構を提供していました。
:=
to mean an empty attribute list事故により、Perl のパーサーは以下の構造が全て等価になってしまっていました:
my $pi := 4;
my $pi : = 4;
my $pi : = 4;
:
は、=
で終わるまでの属性として扱われました。 ここでは空白は意味を持たないので、全ては空属性リストとしてパースされ、 従って上記は全て等価となるので、以下のように書いた方がよいです
my $pi = 4;
なぜなら空リストには属性処理は行われないからです。
今のままでは、これは、既にあるコードの意味を暗黙に変更しなければ、 :=
を新しいトークンとして使えないことを意味します。 従って、特定の形式は非推奨となり、将来文法エラーとなる予定です。 (例えば、コードジェネレータによって)本当に空属性リストが必要な場合は、 =
の前に空白を追加することによって警告を回避してください。
UNIVERSAL->import()
UNIVERSAL->import()
メソッドは非推奨となりました。 インポート引数を use UNIVERSAL
文に渡そうとすると非推奨警告が出ます。
goto
を外側のスコープから内側のスコープへジャンプするために使うのは 非推奨となりました。 この希なユースケースはスコープの実装に問題を引き起こします。
\N{name}
において、name は何でも構いません。 標準の Unicode 名はとても制限された範囲になっていますが、 カスタム名変換器は、例えば、句読点だけからなるシンボルを作ることができます。 英字で始まらない名前や、英数字とその他の数文字(空白、ダッシュ、かっこ、 コロン)以外の文字を含む名前は非推奨となりました。 \N
の意味が追加された("\N
experimental regex escape" を 参照してください)ので、中かっこでくくられた量指定子のように見える 名前は動作しません。 例えば、\N{3,4}
は 3 から 4 文字の非改行文字にマッチングします; 以前はカスタム名 3,4
が作成されていました。
以下のモジュールは将来のリリースではコア配布からは取り除かれ、 代わりに CPAN からインストールするようになります。 CPAN での配布物のでこれらのモジュールが必要な場合は、事前条件に追加する 必要があります。 これらのモジュールのコア版は、非推奨警告を発生させます。
単独、あるいはより大きいシステムの一部として、パッケージ版の Perl を 出荷する場合、非推奨のコアモジュールの影響を注意深く検討するべきです。 いくつか、あるいは全ての非推奨モジュールを perl ライブラリディレクトリ vendor
か site
にインストールして Perl のデフォルトビルドを 出荷したいかもしれません。 これは非推奨警告を抑制します。
あるいは、lib/deprecate.pm にパッチを当てて、 あなたのパッケージシステムや配布が、単一のパッケージのインストールがある 機能を提供するリリースから、同じ機能を得るために複数のパッケージを インストールすることをシステム管理者が知る必要があるより新しいリリースへの 段階的な移行する方法と一貫した、あなたのパッケージシステムや Perl の配布に固有の警告メッセージを提供したいかもしれません。
モジュールを CPAN からインストールすることによって、非推奨警告を 消すことができます。 これら全ての最新版をインストールするには、単に Task::Deprecations::5_12
をインストールしてください。
Switch
はバグが多いので避けるべきです。 Perl の新しい given
/when
機能が適切な代替品です。 さらなる情報については "Switch statements" in perlsyn を 参照してください。
Perl_pmflag
はもはや Perl の公開 API ではありません。 これを呼び出すと非推奨警告が生成され、これは将来のリリースで 取り除かれます。 API の一覧には載っていましたが、文書化されたことはなく、 toke.c と、5.10 以前での regcomp.c でのみ使われていました。 コアでは、これは static 版に置き換えられました。
termcap.pl, tainted.pl, stat.pl, shellwords.pl, pwd.pl, open3.pl, open2.pl, newgetopt.pl, look.pl, find.pl, finddepth.pl, importenv.pl, hostname.pl, getopts.pl, getopt.pl, getcwd.pl, flush.pl, fastcwd.pl, exceptions.pl, ctime.pl, complete.pl, cacheout.pl, bigrat.pl, bigint.pl, bigfloat.pl, assert.pl, abbrev.pl, dotsh.pl, timelocal.pl は全て非推奨となりました。 以前、Perl の開発者は 5.14.0 リリースでこれらのライブラリを Perl コアから 削除しようとしていました。
5.12.0 リリース前の最終テスト中に、複数の開発者が現在の製品コードがこれらの 古いライブラリを使っていることを発見しました; その一部は Perl コア 自身の中にありました。 それで、パンプキングはこれらのライブラリの処刑を猶予しました。 これらは 5.14.0 リリースから非推奨警告が出るようになり、 5.16.0 リリースで削除される予定です。
Perl の開発者は、Perl を最新の Unicode 標準と同期するように更新することに 断固とした努力を行っています。 これに関する変更には以下のものを含みます:
Perl は全ての Unicode 文字特性を扱えるようになりました。 新しい文書である perluniprops には全ての利用可能な非 Unihan 文字特性の 一覧があります。 デフォルトでは、perl は Unihan、非推奨、Unicode 内部の特性を公開しません。 これらに関するさらなる詳細については以下を参照してください; pod にもこれらの一覧があり、なぜ公開しないのかの説明もあります。
正規表現を書くときに =
と :
を使った複合型 Unicode に完全に 対応するようになりました: \p{property=value}
と \p{property:value}
です (これらはどちらも同じ意味です)。
Unicode の\p{...}
構造で、中かっこの間のテキストでの ゆるいマッチングルールに完全に対応しました。 さらに、数値の数字の間に下線を許すようになりました。
Perl は Unicode で定義された、特性への別名と特性値全てを 受け付けるようになりました。
Unicode 論理文字にマッチングする qr/\X/
は、様々なアジア言語で よりよく働くように拡張されました。 これは 拡張書記素クラスタ として定義されます。 (http://www.unicode.org/reports/tr29/ を参照してください)。 以前からマッチングしていたものは引き続きマッチングします。 さらに:
\X
は CR LF
シーケンスに分割されません。
\X
は、ZWJ
と ZWNJ
の文字を含むシーケンスにも マッチングするようになりました。
\X
は常に、最初のマークを含む、最低 1 文字とマッチングするように なりました。 マークは一般的には規定文字の後に現れますが、Unicode ではこれらを 単独で使うことも可能で、\X
はこのような場合、つまり行頭や、 ZWSP
の後のような場合でも正しく扱えるようになりました。 これは、\X
が無意味なものにマッチングしなくなったことの 一部です。 以前は、例えば、アクセント付きの LF という無意味な場合がありました。
\X
はハングル音節文字と、タイとラオスの例外ケースに マッチングするようになりました。
それ以外では、この変更は影響を与えない言語では透過的です。
Canonical_Combining_Class 特性を使った \p{...}
マッチングは 以前にリリースされた Perl では完全に壊れていました。 これらは正しく動作するようになったはずです。
Perl 5.12 より前では、Unicode の Decomposition_Type=Compat
特性と Perl のエクステンションが同じ名前を持っていて、全ての正しい値には マッチングしなくなっていました(100 以上間違えたり、数千間違えたりします)。 Perl のエクステンションの名前は Decomposition_Type=Noncanonical
(短縮形: dt=noncanon
) に変更されました。 これは以前想定していたものと同じ意味を持ちます; つまり全ての 非正準分解型の和集合です; そして Unicode の Compat
は単にその一部です。
\p{Decomposition_Type=Canonical}
はハングル音節文字を 含むようになりました。
\p{Uppercase}
と \p{Lowercase}
は、Unicode 標準がそうするべきと している通りに動作するようになりました。 これは、今までよりもマッチングする文字が数文字多くなることを意味します。
\p{Cntrl}
は \p{Control}
と同じ文字にマッチングするようになりました。 これは、もはや Private Use (gc=co), Surrogates (gc=cs), Format (gc=cf) 符号位置とマッチングしないことを意味します。 Format 符号位置は最大の可能性がある問題を意味します。 これらのうち、36 以外のものは公式に非推奨か、使用は全く お勧めできません。 もっとも広く使われているらしい 36 は、ソフトハイフン (U+00AD), BOM, ZWSP, ZWNJ, WJ 及び同様の文字、さらに双方向制御です。
\p{Alpha}
は \p{Alphabetic}
と同じ文字に マッチングするようになりました。 5.12 より前では、Perl での定義には実際には Alpha (全てのマーク) ではない 多くのものを含んでいる一方、Alpha である多くのものが除外されていました。 \p{Alnum}
と \p{Word}
の定義は Alpha の定義に依存していて、 同様に変更されました。
\p{Word}
は、間違って分数のような非単語文字とマッチングしていましたが、 しなくなりました。
\p{Print}
は、もはや行制御文字 (Tab, LF, CR, FF, VT, NEL) と マッチングしなくなりました。 これにより標準と文書が一致します。
\p{XDigit}
は \p{Hex_Digit}
と同じ文字に マッチングするようになりました。 これは、今マッチングしている文字 [A-Fa-f0-9]
に追加して、 U+FF10: FULLWIDTH DIGIT ZERO のような、22 個の等価な全角文字にも マッチングするようになりました。
数値特性は、Unihan 文字を含むように拡張されました。
Perl の新しい拡張として 'Present_In' あるいは単に 'In' という特性があります。 これは Unicode Age 特性の拡張ですが、\p{In=5.0}
は Unicode バージョン 5.0 現在で 使い方が決定されているあらゆる符号位置に マッチングします。 \p{Age=5.0}
は まさに バージョン 5.0 で追加された符号位置にのみ マッチングします。
多くの特性が、割り当てられていない符号位置に対して正しい値を 持つようになりました。 影響のある特性は Bidi_Class, East_Asian_Width, Joining_Type, Decomposition_Type, Hangul_Syllable_Type, Numeric_Type, Line_Break です。
Default_Ignorable_Code_Point, ID_Continue, ID_Start 特性は現在の Unicode 定義に更新されました。
Perl の以前のバージョンでは、Unicode 内部専用となっているいくつかの 特性が間違って露出していました。 正規表現でこれらを使うと、(有効になっている場合は)非推奨警告メッセージが 生成されます。 問題の特性は: Other_Alphabetic, Other_Default_Ignorable_Code_Point, Other_Grapheme_Extend, Other_ID_Continue, Other_ID_Start, Other_Lowercase, Other_Math, Other_Uppercase です。
Perl がどの Unicode 特性を理解するかをインストール毎に変更可能に なりました。 上述のように、いくつかの特性はデフォルトでは無効になっています。 これには全ての Unihan 特性 (これらは CPAN モジュール Unicode::Unihan 経由でアクセスできます) 、 非推奨特性、Perl が決して露出させない Unicode 内部専用の特性を含みます。
lib/unicore/To
ディレクトリに生成されたファイルは、安定していて、 アプリケーションから直接利用可能であるとより明確に記されました。 これらの新しいハッシュエントリは通常のエントリの形式であり、 マシンがよりよくパースできるようになっています。 Perl はあらゆる特性に関してこのディレクトリにファイルを生成できますが、 ほとんどは抑制されています。 何が書かれるかを変更する手順は perluniprops にあります。
autodie
autodie
は Fatal
モジュール代用品で、新しくレキシカルスコープを 持つものです。 同梱されているバージョンは 2.06_01 です。 このリリースでは、autodie
が有効の時に文字列 eval を使うと、 autodie の振る舞いが周りのスコープに漏れるかもしれないことに 注意してください。 さらなる詳細については "BUGS" in autodie を参照してください。
バージョン 2.06_01 が Perl コアに追加されました。
Compress::Raw::Bzip2
バージョン 2.024 が Perl コアに追加されました。
overloading
このプラグマは、演算子の一部あるいは全部を、レキシカルに無効化あるいは 有効化します。
バージョン 0.001 が Perl コアに追加されました。
parent
parent
は、基底クラスとの ISA 関係をコンパイル時に構築します。 これは、更なる望まない振る舞いなしに base
の主となる機能を 提供します。
バージョン 0.223 が Perl コアに追加されました。
Parse::CPAN::Meta
バージョン 1.40 が Perl コアに追加されました。
VMS::DCLsym
バージョン 1.03 が Perl コアに追加されました。
VMS::Stdio
バージョン 2.4 が Perl コアに追加されました。
XS::APItest::KeywordRPN
バージョン 0.003 が Perl コアに追加されました。
base
バージョン 2.13 から 2.15 に更新されました。
bignum
バージョン 0.22 から 0.23 に更新されました。
charnames
charnames
は Unicode NameAliases.txt データベースファイルを 含むようになりました。 これにより、以前は認識されなかった追加の \N
文字名(例えば "\N{LATIN CAPITAL LETTER GHA}"
) が追加される効果があります。
バージョン 1.06 から 1.07 に更新されました。
constant
バージョン 1.13 から 1.20 に更新されました。
diagnostics
diagnostics
は内部で %.0f フォーマットに対応するようになりました。
diagnostics
はもはや Use of uninitialized value in range (or flip)
警告を抑制しません。 [perl #71204]
バージョン 1.17 から 1.19 に更新されました。
feature
feature
では、:5.10
および :5.10.X
で組み込まれる機能が僅かに 変更されました。 最後の要素 (つまり X
) がもしあっても、単に無視されます。 これは、一般的にはメンテナンスリリースでは新しい機能はないという仮定に 基づいています。 従って、:5.10
と :5.10.X
は同じ効果を持ちます。 これは 5.10.0 で文書化されている振る舞いへの変更です。
feature
は unicode_strings
機能を含むようになりました:
use feature "unicode_strings";
このプラグマは、内部 UTF-8 フラグは設定されていないけれども、128 から 255 までの単一バイト文字を含んでいる文字列に対する、大文字小文字を変更する 操作 (uc
, lc
, ucfirst
, lcfirst
) での Unicode の意味論を 有効にします。
バージョン 1.11 から 1.16 に更新されました。
less
less
には、less
のサブクラスから、自分のスタッシュが %^H のどこに 保管されているかをわかるようにするための stash_name
メソッドが 追加されました。
バージョン 0.02 から 0.03 に更新されました。
lib
バージョン 0.5565 から 0.62 に更新されました。
mro
mro
は XS エクステンションとして実行されました。 文書化されたインターフェースに変更はありません。 利用可能になってしまっていたいくつかの mro::
メソッドの実装詳細に 依存しているコードは、"keep both pieces" になります。
バージョン 1.00 から 1.02 に更新されました。
overload
overload
は 'qr' をオーバーロードできるようになりました。
バージョン 1.06 から 1.10 に更新されました。
threads
バージョン 1.67 から 1.75 に更新されました。
バージョン 1.14 から 1.32 に更新されました。
version
version
は、この文書のはじめの方で記述し、独自の文書もある、 "Version number formats" に対応しました。
バージョン 0.74 から 0.82 に更新されました。
warnings
warnings
に新しい warnings::fatal_enabled()
関数が追加されました。 また、新しい illegalproto
警告カテゴリが追加されました。 この変更については "New or Changed Diagnostics" も参照してください。
バージョン 1.06 から 1.09 に更新されました。
Archive::Extract
バージョン 0.24 から 0.38 に更新されました。
Archive::Tar
バージョン 1.38 から 1.54 に更新されました。
Attribute::Handlers
バージョン 0.79 から 0.87 に更新されました。
AutoLoader
バージョン 5.63 から 5.70 に更新されました。
B::Concise
バージョン 0.74 から 0.78 に更新されました。
B::Debug
バージョン 1.05 から 1.12 に更新されました。
B::Deparse
バージョン 0.83 から 0.96 に更新されました。
B::Lint
バージョン 1.09 から 1.11_01 に更新されました。
CGI
バージョン 3.29 から 3.48 に更新されました。
Class::ISA
バージョン 0.33 から 0.36 に更新されました。
注意: Class::ISA
は非推奨で、将来のバージョンの Perl では 削除されるかもしれません。
Compress::Raw::Zlib
バージョン 2.008 から 2.024 に更新されました。
CPAN
バージョン 1.9205 から 1.94_56 に更新されました。
CPANPLUS
バージョン 0.84 から 0.90 に更新されました。
CPANPLUS::Dist::Build
バージョン 0.06_02 から 0.46 に更新されました。
Data::Dumper
バージョン 2.121_14 から 2.125 に更新されました。
DB_File
バージョン 1.816_1 から 1.820 に更新されました。
Devel::PPPort
バージョン 3.13 から 3.19 に更新されました。
Digest
バージョン 1.15 から 1.16 に更新されました。
Digest::MD5
バージョン 2.36_01 から 2.39 に更新されました。
Digest::SHA
バージョン 5.45 から 5.47 に更新されました。
Encode
バージョン 2.23 から 2.39 に更新されました。
Exporter
バージョン 5.62 から 5.64_01 に更新されました。
ExtUtils::CBuilder
バージョン 0.21 から 0.27 に更新されました。
ExtUtils::Command
バージョン 1.13 から 1.16 に更新されました。
ExtUtils::Constant
バージョン 0.2 から 0.22 に更新されました。
ExtUtils::Install
バージョン 1.44 から 1.55 に更新されました。
ExtUtils::MakeMaker
バージョン 6.42 から 6.56 に更新されました。
ExtUtils::Manifest
バージョン 1.51_01 から 1.57 に更新されました。
ExtUtils::ParseXS
バージョン 2.18_02 から 2.21 に更新されました。
File::Fetch
バージョン 0.14 から 0.24 に更新されました。
File::Path
バージョン 2.04 から 2.08_01 に更新されました。
File::Temp
バージョン 0.18 から 0.22 に更新されました。
Filter::Simple
バージョン 0.82 から 0.84 に更新されました。
Filter::Util::Call
バージョン 1.07 から 1.08 に更新されました。
Getopt::Long
バージョン 2.37 から 2.38 に更新されました。
IO
バージョン 1.23_01 から 1.25_02 に更新されました。
IO::Zlib
バージョン 1.07 から 1.10 に更新されました。
IPC::Cmd
バージョン 0.40_1 から 0.54 に更新されました。
IPC::SysV
バージョン 1.05 から 2.01 に更新されました。
Locale::Maketext
バージョン 1.12 から 1.14 に更新されました。
Locale::Maketext::Simple
バージョン 0.18 から 0.21 に更新されました。
Log::Message
バージョン 0.01 から 0.02 に更新されました。
Log::Message::Simple
バージョン 0.04 から 0.06 に更新されました。
Math::BigInt
バージョン 1.88 から 1.89_01 に更新されました。
Math::BigInt::FastCalc
バージョン 0.16 から 0.19 に更新されました。
Math::BigRat
バージョン 0.21 から 0.24 に更新されました。
Math::Complex
バージョン 1.37 から 1.56 に更新されました。
Memoize
バージョン 1.01_02 から 1.01_03 に更新されました。
MIME::Base64
バージョン 3.07_01 から 3.08 に更新されました。
Module::Build
バージョン 0.2808_01 から 0.3603 に更新されました。
Module::CoreList
バージョン 2.12 から 2.29 に更新されました。
Module::Load
バージョン 0.12 から 0.16 に更新されました。
Module::Load::Conditional
バージョン 0.22 から 0.34 に更新されました。
Module::Loaded
バージョン 0.01 から 0.06 に更新されました。
Module::Pluggable
バージョン 3.6 から 3.9 に更新されました。
Net::Ping
バージョン 2.33 から 2.36 に更新されました。
NEXT
バージョン 0.60_01 から 0.64 に更新されました。
Object::Accessor
バージョン 0.32 から 0.36 に更新されました。
Package::Constants
バージョン 0.01 から 0.02 に更新されました。
PerlIO
バージョン 1.04 から 1.06 に更新されました。
Pod::Parser
バージョン 1.35 から 1.37 に更新されました。
Pod::Perldoc
バージョン 3.14_02 から 3.15_02 に更新されました。
Pod::Plainer
バージョン 0.01 から 1.02 に更新されました。
注意: Pod::Plainer
は非推奨で、将来のバージョンの Perl では 削除されるかもしれません。
Pod::Simple
バージョン 3.05 から 3.13 に更新されました。
Safe
バージョン 2.12 から 2.22 に更新されました。
SelfLoader
バージョン 1.11 から 1.17 に更新されました。
Storable
バージョン 2.18 から 2.22 に更新されました。
Switch
バージョン 2.13 から 2.16 に更新されました。
注意: Switch
は非推奨で、将来のバージョンの Perl では 削除されるかもしれません。
Sys::Syslog
バージョン 0.22 から 0.27 に更新されました。
Term::ANSIColor
バージョン 1.12 から 2.02 に更新されました。
Term::UI
バージョン 0.18 から 0.20 に更新されました。
Test
バージョン 1.25 から 1.25_02 に更新されました。
Test::Harness
バージョン 2.64 から 3.17 に更新されました。
Test::Simple
バージョン 0.72 から 0.94 に更新されました。
Text::Balanced
バージョン 2.0.0 から 2.02 に更新されました。
Text::ParseWords
バージョン 3.26 から 3.27 に更新されました。
Text::Soundex
バージョン 3.03 から 3.03_01 に更新されました。
Thread::Queue
バージョン 2.00 から 2.11 に更新されました。
Thread::Semaphore
バージョン 2.01 から 2.09 に更新されました。
Tie::RefHash
バージョン 1.37 から 1.38 に更新されました。
Time::HiRes
バージョン 1.9711 から 1.9719 に更新されました。
Time::Local
バージョン 1.18 から 1.1901_01 に更新されました。
Time::Piece
バージョン 1.12 から 1.15 に更新されました。
Unicode::Collate
バージョン 0.52 から 0.52_01 に更新されました。
Unicode::Normalize
バージョン 1.02 から 1.03 に更新されました。
Win32
バージョン 0.34 から 0.39 に更新されました。
Win32API::File
バージョン 0.1001_01 から 0.1101 に更新されました。
XSLoader
バージョン 0.08 から 0.10 に更新されました。
attrs
Perl コアから削除されました。 以前のバージョンは 1.02 でした。
CPAN::API::HOWTO
Perl コアから削除されました。 以前のバージョンは 'undef' でした。
CPAN::DeferedCode
Perl コアから削除されました。 以前のバージョンは 5.50 でした。
CPANPLUS::inc
Perl コアから削除されました。 以前のバージョンは 'undef' でした。
DCLsym
Perl コアから削除されました。 以前のバージョンは 1.03 でした。
ExtUtils::MakeMaker::bytes
Perl コアから削除されました。 以前のバージョンは 6.42 でした。
ExtUtils::MakeMaker::vmsish
Perl コアから削除されました。 以前のバージョンは 6.42 でした。
Stdio
Perl コアから削除されました。 以前のバージョンは 2.3 でした。
Test::Harness::Assert
Perl コアから削除されました。 以前のバージョンは 0.02 でした。
Test::Harness::Iterator
Perl コアから削除されました。 以前のバージョンは 0.02 でした。
Test::Harness::Point
Perl コアから削除されました。 以前のバージョンは 0.01 でした。
Test::Harness::Results
Perl コアから削除されました。 以前のバージョンは 0.01 でした。
Test::Harness::Straps
Perl コアから削除されました。 以前のバージョンは 0.26_01 でした。
Test::Harness::Util
Perl コアから削除されました。 以前のバージョンは 0.01 でした。
XSSymSet
Perl コアから削除されました。 以前のバージョンは 1.1 でした。
上述の "Deprecated Modules" を参照してください。
perlhaiku には、Haiku プラットフォームで perl をビルドする方法に ついての説明が含まれています。
perlmroapi は、プラグ可能なメソッド解決順序の新しい インターフェースを記述しています。
perlperf は Richard Foley によるもので、perl プログラムの個々の 参照で使えるパフォーマンスと最適化の技術の使用に関する導入を 提供します。
perlrepository は、git バージョン管理システムを使って perl の ソースにアクセスする方法について記述しています。
perlpolicy は "Social contract about contributed modules" を Perl 移植ポリシーの文書の先頭に拡張しました。
(過去 18 年間にわたって perl に対して行われた全ての変更の一覧である) 様々な大きな Changes* ファイルが取り除かれ、 単に git バージョン制御システムから同じ情報を取り出す方法を説明した 小さいファイル Changes に置き換えられました。
Porting/patching.pod は削除されました; これは主に古い Perforce を基としたレポジトリとの相互作用について記述していて、 これは古いものです。 まだ関連のある情報は perlrepository に移動しました。
unless (EXPR) BLOCK else BLOCK
という文法は有効であると文書化されました; unless (EXPR) BLOCK elsif (EXPR) BLOCK ... else BLOCK
も同様です; しかし実際には後者を使うことは、ソースコードの可読性の面から 最良の考えではないでしょう。
-X のオーバーロードが文書化されました。
when()
がほとんどのファイルテスト演算子を特別に扱うことが文書化されました。
文法修飾子としての when
が文書化されました。
5005 スレッドを記述した、「古い Perl スレッドのチュートリアル」が 削除されました。
pod/perlthrtut.pod はiスレッド用に書き換えられています。
以前の文書が修正されました: v-文字列は非推奨ではありません
バージョンオブジェクトに対しては use MODULE VERSION 文法を使う必要が あります。 このパッチにより、非推奨の注意は削除されました。
セキュリティ窓口情報は perlsec の一部となりました。
コア文書のかなりの割合に対して、Perl の Unicode の扱いに関する振る舞いを 明確にするために更新されました。
残りのコアドキュメントのほとんどが、明確化、言語の一貫した使用、 Tom Christiansen の綴りの修正のために見直され編集されました。
Pod 仕様書 (perlpodspec) は、ほとんどの Pod システムが既に対応している モダンな使用法に対応するように更新されました。 パラメータ文字列は "begin/end" 領域のフォーマット名の後に続くように なりました。 説明テキスト付きの URI へのリンクが可能になりました。 L<"section">
という使い方は非推奨となりました。
if.pm は "use" in perlfunc で、use
の周りの暗黙の BEGIN ブロックにも 関わらず、モジュールの条件付き読み込みの意味で文書化されていました。
perlvar.pod の $1
に関する文書が明確されました。
\N{U+wide hex char}
が文書化されました。
新しい内部キャッシュにより、isa()
はしばしばより速くなります。
C3
実装解決順序の実装が最適化されました - 単一継承クラスの 線形化は 40% 速くなりました。 多重継承の性能は変わりません。
use locale
の元では、ロケール関係の情報は、keys %hash
で 返されるリストのように、読み込み専用値としてキャッシュされるように なりました。 これによって、use locale
での sort keys %hash
のような操作が とても速くなります。
空の DESTROY
メソッドはもはや呼び出されなくなります。
Perl_sv_utf8_upgrade()
はより速くなりました。
空ハッシュに対する keys
はより速くなりました。
if (%foo)
は if (keys %foo)
より早くなるように最適化されました。
文字列繰り返し演算子 ($str x $num
) は、$str
が 1 文字だったり $num
が大きいときに数倍速くなりました。
無効コンテキストで (@a = reverse @a
のように) 配列を反転して 自分自身に代入する場合、その場で行われるようになり、 以前より数桁速くなりました。 これはまた存在しない要素をできるだけ保存します; つまり、マジカルでない 配列や EXISTS
と DELETE
メソッドを持つ tie された配列の場合です。
perlapi, perlintern, perlmodlib, perltoc はリリースの 一部としてではなく、全てビルド時に生成されるようになりました。
vendorlib
と vendorarch
が同じなら、@INC
には 1 回だけ 追加されます。
もし perl が -Dusedevel
付きでビルドされたなら、 $Config{usedevel}
と C レベルの PERL_USE_DEVEL
が定義されるように なりました。
Configure は、もしコンパイラが対応しているなら、 スタック破壊攻撃に対する防御のために、-fstack-protector
の使用を 有効にします。
Configure は、もし C コンパイラでなく C++ コンパイラを使うなら、 再入可能な関数と gconvert
のための正しいプロトタイプを 決定するようになりました。
Unix では、もし git レポジトリを含むツリーからビルドするなら、 設定プロセスは perl -v
と perl -V
の出力での表示のために、 チェックアウトしたコミットハッシュを記録します。 プッシュされないローカルのコミットは自動的に perl -V
によって表示されるローカルパッチの一覧に追加されます。
SystemTap の dtrace
互換層に対応し、その過程で miniperl
が リンクするときの問題を修正しました。
perldoc は、groff
の ANSI エスケープコードの新しい使い方に直面したときの 振る舞いを改善するために、less
ではなく less -R
を使うようになりました。
perl -V
はコンパイル時オプション USE_PERL_ATOF
と USE_ATTRIBUTES_FOR_PERLIO
の仕様について報告するようになりました。
ext のフラット化の一部として、全てのプラットフォームの全ての エクステンションは make_ext.pl でビルドされます。 これは Unix 固有の ext/util/make_ext、VMS 固有の make_ext.com、 Win32 固有の win32/buildext.pl を置き換えます。
Perl のそれぞれのリリースでは普段の使用には影響を与えないはずの 多くの内部変更を行っていますが、 それでも Perl のソースコードで作業をする開発者にとって 注目するべきものもあります。
C ソースファイルの先頭にある J.R.R. Tolkien の引用文がチェックされ、 適切な言及が追加されました; Tom Christiansen からのパッチに感謝します。
伝統的に lib/ と ext/ ディレクトリにあった二重管理モジュールの 内部構造が大きく変わりました。 可能であれば、二重管理モジュールは lib/ と ext/ から展開されました。
Perl コアの一部として Perl の開発者によって保守されている二重管理 モジュールは dist/ に移動しました。 CPAN をプライマリとして保守されている二重管理モジュールは cpan/ に 移動しました。 cpan/ にあるモジュールのバグを報告する場合は、Perl の バグトラッカーではなく、モジュールのバグトラッカーや作者に直接 送ってください。
\N{...}
はよりよくコンパイルされるようになり、常に UTF-8 内部表現が強制されます
Perl の開発者は \N{...}
構造の認識に関するいくつかの問題を修正しました。 この一部として、定義で \N{name}
や \N{U+wide hex char}
を 含むあらゆるスカラや正規表現を UTF-8 形式で保管できるようになりました (これは以前はカスタム変換器を使っていない \N{name}
について 真でしたが、今は常に真です。)
Perl_magic_setmglob は glob について知るようになります; RT #71254 を修正しました。
SVt_RV
はもはや存在しません。 RV は IV に保管されます。
Perl_vcroak()
は最初の引数として null も受け付けるようになりました。 さらに、「非 NULL」に関するコンパイラ注釈の完全な監査が行われ、 その他のいくつかの内部関数が修正されました。
errno
変数を一時的に補完することを形式化するための、 dSAVEDERRNO
, dSAVE_ERRNO
, SAVE_ERRNO
, RESTORE_ERRNO
という 新しいマクロが追加されました。
Perl_sv_insert
関数を拡大するために、Perl_sv_insert_flags
関数が 追加されました。
Perl_newSV()
の後 Perl_sv_upgrade(type)
を実行するのと等価な、 Perl_newSV_type(type)
関数が追加されました。
Perl_newSVpvn_flags()
関数が追加されました; これは Perl_newSVpvn()
と 等価で、それからフラグに関連する動作を行います。
現在のところ二つのフラグビットに対応しています。
SVf_UTF8
はあなたのために SvUTF8_on()
を呼び出します。 (これは ISO 8859-1 文字のシーケンスを UTF-8 に変換しないことに 注意してください。) これのためのラッパである newSVpvn_utf8()
が利用可能です。
SVs_TEMP
は新しい SV に対して sv_2mortal()
を呼び出すようになります。
定数文字列を取るラッパである newSVpvs_flags()
もあります。
Perl_croak
へのラッパとして、Perl_croak_xs_usage
関数が追加されました。
PerlIO_find_layer
関数と PerlIO_list_alloc
関数が エクスポートされるようになりました。
PL_na
はコアコードから全て取り除かれ、ローカルな STRLEN テンポラリか *_nolen()
呼び出しに置き換えられました。 どちらの手法も、ithreads ではインタプリタ構造体へ、さもなければ グローバル変数へポインタへのデリファレンスである PL_na
よりも高速です。
Perl_mg_free()
は、スカラでの SvMAGIC()
経由でアクセスできる 開放されたメモリをそのままにしていました。 それぞれのマジックのかけらが開放されるごとに削除されるように、 リンクリストが更新されるようになりました。
ithreads において、PL_reg_curpm
内の正規表現は参照カウントを 行うようにありました。 これにより、参照カウントを行っていないことによる多くのハックっぽい 回避方法が不要になります。
Perl_mg_magical()
は時々間違って SvRMAGICAL()
を作動させていました。 これは修正されました。
IV と NV の public フラグは、もし文字列値の末尾に「ゴミ」が ついている場合はセットされなくなりました。 この振る舞いは、値が型の範囲を超えているときに IV や NV の public フラグがセットされないことと一貫しています。
Nullav
, Nullcv
, Nullhv
, Nullop
, Nullsv
などは、 コアコードおよび 2 重管理されていないモジュールでは NULL
に置き換えられました; NULL
はコアコードに親しんでいなくても より明確だからです。
MUTABLE_PTR(p)
マクロが追加されました; これは (pedantic でない) gcc では const
状態を捨てずに、void *
を返します。 MUTABLE_SV(av)
, MUTABLE_SV(cv)
などのマクロはこれを使って 作成され、const
状態を捨てることなく AV *
などにキャストします。 これにより const
の正当性の適切なコンパイル時の監査が可能になり、 いくつかのエラーの発見に役立ちました(これらは修正されました)。
SV をスタックにプッシュし、それを揮発化させるための、 mPUSHs()
と mXPUSHs()
のマクロが追加されました。
プライベート構造体 mro_meta
の使用が少し変更されました。 どちらにしろ、コアの外側からこれにアクセスすることは出来ません。
新しいツールである Porting/expand-macro.pl が追加され、 コンパイル時に C プリプロセッサマクロがどのように展開されるかを見られます。 これは perl の内部でマクロを展開しようとする時に便利です。
コア配布は、Unix 風プラットフォームでは退行テストを並列に実行できるように なりました。 make test
を実行する代わりに、環境変数 TEST_JOBS
に並列に 実行するテスト数を設定して、make test_harness
を実行します。 Bourne-風のシェルでは、これは以下のようにします
TEST_JOBS=3 make test_harness # Run 3 tests in parallel
並列 make 自身ではなく、環境変数を使います; なぜなら TAP::Harness はここの競合しないテストスクリプト自身を計画できる必要が ありますが、make
ユーティリティのジョブスケジューラと相互作用するための 標準的なインターフェースはないからです。
いくつかのテストスクリプト(特に ext/IO/t/io_dir.t
)は並列に実行すると 失敗するかもしれないことに注意してください。 もし必要なら、失敗したスクリプトを順番に再実行して、失敗しなくなることを 確認してください。
PERL5OPT
と t/TEST にある親類を上書きできるようになりました。
いくつかのテストは、テストが時間切れになった後に kill することで make test
と make test_harness
が自動的に実行を終了することを 確実にするために組み込まれた「番犬」機能で失敗すると、 ハングアップしてしまう可能性がありました。
Perl の開発者は多くの新しいテストをコアに追加しました。 以下に挙げたものに加えて、CPAN から更新された多くのモジュールに 新しいテストが追加されています。
Significant cleanups to core tests to ensure that 言語とインタプリタの機能がテスト前に使われないことを確実にするために、 コアのテストがかなり整理されました。
make test_porting
は、 Perl コアで作業をしている全員が使うべき、多くの重要なコミット前チェックを 実行します。
t/porting/podcheck.t は、Perl コア外で主に管理されている 二重管理のモジュール以外において、 MANIFEST にある全ての .pl, .pm, .pod ファイルで見つかった POD の形式が正しいかどうかをチェックします。
t/porting/manifest.t は、 MANIFEST に挙げられている全てのファイルが存在するかをテストします。
t/op/while_readdir.t は、 while ループ中の裸の readdir が $_ をセットするかをテストします。
t/comp/retainedlines.t は、 デバッガが eval
からソース行を得られるかをチェックします。
t/io/perlio_fail.t は 間違った層が失敗するかをチェックします。
t/io/perlio_leaks.t は PerlIO 層がリークしていないかをチェックします。
t/io/perlio_open.t は open のある種の特殊な形式が動作するかをチェックします。
t/io/perlio.t は PerlIO を全体的にテストします。
t/io/pvbm.t は 内部型 PVBM
と PVGV
の間で想定外の相互作用がないことを チェックします。
t/mro/package_aliases.t は エイリアス化されたパッケージが存在したときに MRO が適切に動作するかを チェックします。
t/op/dbm.t は dbmopen
と dbmclose
をテストします。
t/op/index_thr.t は index
とスレッドの相互作用をテストします。
t/op/pat_thr.t は 難解なパターンとスレッドの相互作用をテストします。
t/op/qr_gc.t は qr
がリークしていないことをテストします。
t/op/reg_email_thr.t は regex 再帰とスレッドの相互作用をテストします。
t/op/regexp_qr_embed_thr.t は 組み込みの qr//
があるパターンとスレッドの相互作用をテストします。
t/op/regexp_unicode_prop.t は 正規表現中の Unicode 特性をテストします。
t/op/regexp_unicode_prop_thr.t は Unicode 特性とスレッドの相互作用をテストします。
t/op/reg_nc_tie.t は Tie::Hash::NamedCapture
の tie されたメソッドをテストします。
t/op/reg_posixcc.t は POSIX 文字クラスが一貫性を持って振る舞うかをチェックします。
t/op/re.t universal.c のエクスポート可能な re
関数が動作するかを チェックします。
t/op/setpgrpstack.t は setpgrp
が動作するかをチェックします。
t/op/substr_thr.t は substr
とスレッドの相互作用をテストします。
t/op/upgrade.t は スカラの昇格と代入が動作するかをチェックします。
t/uni/lex_utf8.t は 文法解析器中の Unicode が動作するかをチェックします。
t/uni/tie.t は Unicode と tie
が動作するかをチェックします。
t/comp/final_line_num.t は、 行番号が EOF で正しいかどうかをテストします。
t/comp/form_scope.t は フォーマットのスコープをテストします。
t/comp/line_debug.t は @{"_<$file"}
が動作するかどうかをテストします。
t/op/filetest_t.t は -t ファイルテストが動作するかどうかをテストします。
t/op/qr.t は qr
をテストします。
t/op/utf8cache.t は utf8 キャッシュの障害をテストします。
t/re/uniprops.t は Unicode \p{}
正規表現構造をテストします。
t/op/filehandle.t は、移植性のあるファイルテスト演算子が適切に 動作するかどうかをテストします; 特に、どのようにファイルハンドルが bless するかに関する内部変更に 光を当てています。
t/op/time_loop.t は、2**63
よりも大きい unix time をテストします; これは gmtime
と localtime
で扱えるようになっていて、内部 オーバーフローや, 過度に長いループを引き起こしません。
-Dm
で有効になる診断に、SV 割り当てトレースが追加されました。 トレースは、もし perl バイナリがコンパイルされたときに PERL_MEM_LOG
機構が有効になっていた場合には、これを通しても出力されます。
スマートマッチングの解決のトレースが新しい診断として追加されました。 これを有効にするには -DM
を使ってください。
新しいデバッグフラグ -DB
はサブルーチン定義をダンプするようになり、 -Dx
は文法気を出力するという元々の目的のために残されました。
Perl 5.12 は、よりよいコードを書くことを助ける多くの新しい診断メッセージを 提供します。 これらの新しいメッセージの詳細については perldiag を参照してください。
Bad plugin affecting keyword '%s'
gmtime(%.0f) too large
Lexing code attempted to stuff non-Latin-1 character into Latin-1 input
Lexing code internal error (%s)
localtime(%.0f) too large
Overloaded dereference did not return a reference
Overloaded qr did not return a REGEXP
Perl_pmflag() is deprecated, and will be removed from the XS API
lvalue attribute ignored after the subroutine has been defined
この新しい警告は、あるサブルーチンを定義した後、それを左辺値として マークしようとしたときに発生します。
++
や --
が、表現の限界を超えるために値の変更が出来ない 場合に警告するようになりました。
これは新しい警告カテゴリ "imprecision" を使います。
lc
, uc
, lcfirst
, and ucfirst
warn when passed undef.
Show constant in "Useless use of a constant in void context"
Prototype after '%s'
panic: sv_chop %s
これは、C ルーチン Perl_sv_chop()
に、スカラの文字列バッファ内でない 位置が渡された時に発生する、新しい致命的エラーです。 これはバグっぽい XS コードによって引き起こされ、この時点では 回復は不可能です。
致命的エラー Malformed UTF-8 returned by \N
は、charnames
ハンドラが 不正な UTF-8 を返したときに生成されるようになりました。
正規表現のコンパイル時に未解決の名前付き文字やシーケンスが発見された場合、 致命的エラー \N{NAME} must be resolved by the lexer
が生成されます。 これは、例えば、$re = '\N{SPACE}'; /$re/;
のようなシングルクォート風の コンテキストを使うときに発生します。 字句解析器がどのようにバイパスされるかに関するもっと多くの例については、 perldiag を参照してください。
Invalid hexadecimal number in \N{U+...}
は新しい致命的エラーで、 ...
で表現される文字定数が有効な 16 進数でなかった場合に発生します。
[^\n]
としての新しい \N
の意味は、.
が特別な 意味を失うのと同様、大かっこの文字クラスの中では無効となり、 致命的エラー \N in a character class must be a named character: \N{...}
を発生させます。
\N{...}
内の ...
として有効なものの規則が厳しくなったので、 ...
が英文字で始まって、英数字、ダッシュ、空白、かっこ、コロンが 引き続くものでない場合、 Deprecated character(s) in \N{...} starting at '%s'
警告が 発生するようになりました。
Using just the first characters returned by \N{}
警告は、 charnames
ハンドラが、利用できる文字数の制限を超えた文字シーケンスを 返すときに発生し、 このメッセージは、使われた文字と捨てられた文字を示しています。
既にある多くの診断メッセージが改良されたり修正されたりしました:
新しい警告カテゴリ illegalproto
は、関数プロトタイプの関する警告を より細かい粒度で制御できるようにします。
二つの警告:
Illegal character in prototype for %s : %s
Prototype after '%c' for %s : %s
これらは、syntax
トップレベル警告カテゴリから新しい第一レベルカテゴリ illegalproto
に移動しました。 これら二つの警告は今のところ不正なプロトタイプをパースしたときに 出力される唯一のカテゴリなので、以下のようにすることで
no warnings 'illegalproto';
これらだけを抑制し、その他の文法関係の警告はそのままにできます。 プロトタイプが変更、無視、遭遇しなかったときの警告は今まで通り prototype
カテゴリのままです。
Deep recursion on subroutine "%s"
この警告が出る深さの閾値は、デフォルトでは 100 ですが、C プリプロセッサ マクロ PERL_SUB_DEPTH_WARN
を好みの値に変えて perl バイナリを 再コンパイルすることによって、変更できるようになりました。
Illegal character in prototype
警告は、_ の後の不正な文字を 報告するときにより正確になりました。
mro 結合エラーメッセージは、Algorithm::C3 が生成するものと とても似ているものになりました。
エラーメッセージ "Unrecognized character %s in column %d" の改善
このエラーメッセージは "Unrecognized character %s; marked by <-- HERE after %s<-- HERE near column %d" に変更されました。 これによって、怪しい文字の特定と修正が少しだけ簡単になったはずです。
スカラコンテキストでの範囲に関する未初期化警告を引き起こすとき、 明示的に $.
を示すようになりました。
split
は、無効コンテキストで呼び出されると警告するようになりました。
printf
形式の関数呼び出しで引数が足りない場合、警告 "Missing argument in %s"
が発生するようになりました。 [perl #71000]
each
, keys
, values
が引数なしで使われた場合、 セグメンテンションフォールトではなく、正しく文法エラーを 返すようになりました。
何もファイルを読み込んでいない状態で tell()
が引数なしで 呼び出された場合、正しく失敗するようになりました。
tell()
は -1
を返し、errno に EBADF
がセットされます; これにより 5.8.x での振る舞いが再現されました。
overload
は繰り返して 'use overload' 行があった場合でも、 暗黙のうちにフォールバックを解除しなくなりました。
POSIX::strftime() はフォーマット文字列で Unicode 文字が 扱えるようになりました。
deprecated
カテゴリだけであるべき 5 個の警告から syntax
カテゴリが 取り除かれました。
三つの致命的な pack
/unpack
エラーメッセージが panic: %s
に 正規化されました。
Unicode character is illegal
はより正確になるように言い換えられました。
現在は Unicode non-character is illegal in interchange
となり、 perldiag 文書が少し拡張されました。
現在のところ、charnames
ハンドラが複数の文字を返した場合の先頭以外の 文字は、これが正規表現や大かっこ文字クラスの中で使われたときには 捨てられます。 もしこれが起きると、 Using just the first character returned by \N{} in character class
警告が発生します。
Missing right brace on \N{} or unescaped left brace after \N. Assuming the latter
警告は、Perl が \N{
に遭遇したけれども 対応する }
がない場合に発生します。 この場合、これが間違って省略されたのか、あるいは「非改行にマッチング」の 後に「{
にマッチング」を想定しているのかが Perl には分かりません。 他の場合と異なり、後者は実際書いたままのものを有効に解釈できるので、 後者を仮定します。 もし前者を意味していたのなら、対応する右中かっこを追加する必要があります。 もし後者を意味していたのなら、代わりに \N\{
と書くことで 警告を黙らせることができます。
確実に扱える値より小さい値で gmtime
と localtime
を呼び出すと、 gmtime(%.0f) too small
と localtime(%.0f) too small
の警告が 出るようになりました。
以下の診断メッセージは削除されました:
Runaway format
Can't locate package %s for the parents of %s
一般的に、この警告は他の警告と同時にのみ生成され、これを取り除くことによって ISA 読み出しの最適化が追加できるようになりました。
v-string in use/require is non-portable
h2ph は、 最近 gcc の検索パスとして追加された、include-fixed
を見るように なりました。
h2xs は マクロのような enum 値を間違って扱わなくなりました。 また、enum での C++ 形式のコメント (//
) を扱うようになりました。
perl5db.pl は LVALUE
サブルーチンを対応するようになりました。 さらに、デバッガは代理定数サブルーチンとサブルーチンスタブを正しく 扱えるようになりました。
perlbug は、上流のバグトラッカー URL の出力に %Module::CoreList::bug_tracker
を使うようになりました。 もしユーザーが送るバグ報告の話題としてあるモジュールがあることが分かり、 そのモジュールの上流のバグトラッカーの URL が分かる場合は、perlbug は、 コアは CPAN バージョンを直接コピーしていることをユーザーに説明する メッセージと、上流の作者に直接バグを報告するための URL を出力します。
perlbug は、実際にはメッセージを送れなかった場合には "Message sent" と報告しなくなりました。
perlthanks は、Perl の作者と管理者にバグ報告ではないレポートを送るための 新しいツールです。 バグレポートでしかないものを受け取るのは少しがっかりさせるものに なりつつあります。 もしあなたのところで Perl 5.12 がうまく働いているなら、 perlthanks を試してみてください。 開発者を笑顔にすることでしょう。
Perl の開発者は、match()
をリストコンテキストで 使わなければならなくなるという a2p のバグを修正しました。 さらに、a2p はもはや $[
変数を使ったコードを生成しなくなりました。
U+0FFFF は正規表現で有効な文字となりました。
pp_qr は常に新しい正規表現 SV を返すようになりました。 RT #69852 を解決しました。
命令木の(プリコンパイルされた)正規表現へのリファレンスを返すのではなく、 そのコピーを作成するために reg_temp_copy() を使い、それに対する リファレンスを返します。 これは Regexp::DESTROY が適切なタイミングでで呼び出されないという 問題(元々のバグは RT #69852 で追跡されています)を解決し、 チケットに追加された文章で記述されているような、正規表現の bless と 正規表現への代入に関するバグも解決しました。
これにより、iスレッドが正規表現 SV のクローンを作るとき、SvPVX() の 共有を取り消す必要もあることがわかります; なぜなら mother_re は mother_re をクローンしたコピーではなく、NULL が セットされるからです。 この変更はその他のある種の状況での正規表現とスレッドに関するバグを 修正するかもしれませんが、未だにテストやバグ報告は何の問題も 示していないので、実際には到達する可能性のある境界条件では ないのかもしれません。
perl を -Dmad
付きでコンパイルするとコンパイルエラーや セグメンテーションフォールトが起きていたのを修正しました。
5.11.2 で行われた 字句解析 API の変更が NYTProf の savesrc オプションを 壊していたのを修正しました。
-t
は TTY と接続されているファイルハンドルに対してのみ TRUE を 返すべきでした。
The Microsoft C 版の isatty()
は、 /dev/null 形式の "nul" デバイスや "lpt1" のようなプリンタを含む 全てのキャラクタデバイスに対して TRUE を返します。
引数を渡す間の panic を引き起こす fafafbaf をコミットしたことによる エンバグを修正しました [perl #70171]
バックアップファイルなしでその場で修正するシステムで、 -i'*' が文書に記されているとおりに動作するようになりました。 [perl #70802]
マジックフラグの保存と復帰で読み込み専用フラグを 失わないようになりました。
不正な文法 grep EXPR LIST
(カンマがないことに注意) で、 突然完全に失敗しなくなりました。
qr{}
リテラルを使ってコンパイルされた正規表現で、再び マッチングしたときに適切に $'
がセットされるようになりました。
sort
で名前付きサブルーチンを使ったときに、バスエラーを 引き起こさなくなりました。 [perl #71076]
最近追加された語句解析 API によって引き起こされた多くの小さな問題が 修正されました。
@_
を使ったスマートマッチングが時々間違っていました。 [perl #71078]
$@
は (エラーやスタック破壊なしに) 読み込み専用値を 代入できるようになりました。
動作中の比較サブルーチンの中から sort
を再帰的に呼び出すと、 複数回実行してもバスエラーが起きなくなりました。[perl #71076]
Tie::Hash::NamedCapture::* は、悪い入力を渡すと中断するようになりました (RT #71828)
@_ と $_ はスレッドでリークしなくなりました (RT #34342 と #41138, また #70602, #70974)
シェバン行での -I
は文書通り、コマンドラインで指定した -I
と 同様、@INC の先頭に追加されるようになりました。
kill
は、非数値プロセス識別子で呼び出されたときには致命的エラーに なるようになりました。 以前は、プロセス識別子として undef
を渡すと、プロセス 0 を kill すると 解釈され、POSIX システムで現在のプロセスグループが終了していました。 プロセス識別子は常に整数なので、非数値プロセスを kill しようとするのは 致命的エラーとなりました。
5.10.0 では不注意によって最適化が無効化されていたため、 例えば @_
から関数の引数への代入でよく使われるような、 リスト代入において目に見えるほどの性能低下を引き起こしていました。 この最適化は再導入され、性能面の退行が修正されました。 (この修正は 5.10.1 でも行われています)
while (1) { map 1, 1 }
でのメモリリークが修正されました [RT #53038]。
PerlIO でのコアダンプの可能性が修正されました [RT #57322,54828]。
デバッガは左辺値サブルーチンでも動作するようになりました。
定数が定義されたモジュールでは、デバッガの m
コマンドが壊れていました [RT #61222]。
crypt
と文字列補完は汚染されていない引数から汚染された値を返すことが ありました [RT #59998].
-i
.suffix コマンドラインオプションは、元のファイルに一致するように モードを変更する前に、制限されたパーミッションを使ってファイルを 再作成します。 これは競合条件の可能性を除去します [RT #60904]。
Unix システムによっては、$?
の値が、子がコアダンプしたときでも 最上位ビット ($? & 128
) がされないことがありました。
状況によっては、$^R
が間違って未定義になりました [RT #57042]。
XS API で、様々なハッシュ関数において、キーが UTF-8 の時に予め 計算されたハッシュを渡すと、読み出しを間違うことがありました。
perl.h の前に XSUB.h をインクルードした XS コードでコンパイル時 エラーが発生していました [RT #57176]。
$object->isa('Foo')
は、たとえ オブジェクトの @ISA
に Foo
を含んでいても、パッケージに Foo
が存在していなければ偽を 返すようになりました。
5.10.0 で新規導入された mro コードで、@ISA
を操作することによって 引き起こされる様々なバグが発見され、修正されました。
$x=\$y; $x |= "foo"
のような、リファレンスに対するビット単位演算子が インタプリタをクラッシュさせることがありました [RT #54956]。
代替を含むパターンが内部 UTF-8 表現に敏感になっていました;
my $byte = chr(192);
my $utf8 = chr(192); utf8::upgrade($utf8);
$utf8 =~ /$byte|X}/i; # failed in 5.10.0
UTF8-エンコードされた (つまり use utf8
が有効な) Perl ソースファイル内で、 ダブルクォートされたリテラル文字列が、 could be corrupted where a \xNN
, \0NNN
, \N{}
の後に その値が 255 を超えるリテラル文字が続いている場合に、壊れることがありました [RT #59908]。
B::Deparse
は様々な構造を逆パースするのに失敗していました: readpipe STRING
[RT #62428], CORE::require(STRING)
[RT #62488], sub foo(_)
[RT #62484].
setpgrp
を引数なしで使うと、perl のスタックが壊れることがありました。
ブロック形式の eval
は特別に Safe
と ops
でトラップ可能に なりました。 以前は間違って文字列の eval
のように扱われていました。
5.10.0 では、2 つの文字 [~
が時々スマートマッチング演算子 (~~
) としてパースされていました [RT #63854]。
5.10.0 では、パターン中の *
量指定子が時々 {0,32767}
として扱われていました[RT #60034, #60464]。 例えば、以下はマッチングに失敗していました:
("ab" x 32768) =~ /^(ab)*$/
shmget
は 64 ビット OS で 32 ビットセグメントサイズに制限されていました [RT #63924]。
given
ブロックから出るために next
や last
を使ったときに、 以下のような誤った警告が出力されなくなりました:
Exiting given via last at foo.pl line 123
以下のように、フォーマットからグロブへの代入を行うと、 フォーマットが壊れることがありました:
*bar=*foo{FORMAT}; # foo format now bad
型グロブを文字列や数値に変換しようとすると、アサーション失敗が 発生することがありました。 正しいエラーメッセージである Can't coerce GLOB to $type
が 生成されるようになりました。
use filetest 'access'
中に、-x
は間違ったアクセスモードを 使っていました。 これは修正されました [RT #49003]。
Unicode 値を返す tie されたスカラに対する length
が、初回は 正しく動作していませんでした。 これは修正されました。
配列 tie
の中で配列 tie
を使うと SEGV になることがありました。 これは修正されました。 [RT #51636]
PerlIOStdio_close()
内での競合条件が識別され、修正されました。 これは SEGV を含む、様々なスレッドの問題を引き起こしていました。
unpack
で、スカラコンテキストで ()
グループを使うと、内部的に インタプリタのスタックにリストが置かれ、SEGV を含む様々な現象が 起きていました。 これは修正されました [RT #50256]。
substr
, \&$x
, tie $x, $m
, chop
で、マジックが 2 回 呼び出されていました。 これらは全て修正されました。
5.10.0 での、s///ge
の暗黙のループ中の一時的なスタックをクリアするという 最適化は差し戻されました; これがインタプリタの無関係な部分での 不明瞭なバグの原因となっていたからです [commit ef0d4e17921ee3de]。
elsif
内での警告の行番号が正しくなりました。
..
演算子は、どちらかの端が整数の最小値や最大値に近い値でも 正しく動作するようになりました。
binmode STDIN, ':raw'
は、プラットフォームによってはセグメンテーション フォルトを引き起こすことがありました。 これは修正されました [RT #54828]。
index $str, ...
が実際には index "$str\0", ...
として実行されるという 境界条件のエラーがありました。 これは修正されました [RT #53746]。
正規表現での名前付き捕捉に関連する様々なリークが修正されました [RT #57024]。
ハッシュへの弱いリファレンスがリークを起こすことがありました。 これは DBI
に影響を与えていました [RT #56908]。
正規表現で (?|) を使うとセグメンテンションフォールトを引き起こすことが ありました [RT #59734]。
クロージャ内で UTF-8 の tr//
を使うとセグメンテンションフォールトを 引き起こすことがありました [RT #61520]。
Perl_sv_chop()
やその他で SV を昇格させると、SPARC アーキテクチャでは アライメントされていない 64-ビットアクセスをする場合がありました [RT #60574]。
5.10.0 リリースでは、inc_version_list
は間違って 5.8.*
の後に 5.10.*
をリストしていました; これは @INC
の検索順に影響を 与えていました [RT #67628]。
5.10.0 では、pack "a*", $tainted_value
は汚染されていない値を 返していました [RT #52552]。
5.10.0 では、printf
と sprintf
で UTF-8 文字列を表示するときに 致命的エラー panic: utf8_mg_pos_cache_update
が出ることがありました [RT #62666]。
5.10.0 リリースでは、動的に作成した AUTOLOAD
メソッドが失われることが ありました (メソッドキャッシュの問題です) [RT #60220,60232]。
5.10.0 リリースでは、use feature
と //ee
の組み合わせで メモリリークを起こすことがありました [RT #63110]。
shebang (#!
) 行 での -C
は、コマンドラインでも指定されている場合は 再び許可されるようになりました。 shebang 行での -C
は、もし コマンドラインで指定されていなかった 場合には暗黙に no-op となっていました; これは perl 5.10.0 では 不許可となりましたが、これによって動かなくなるスクリプトもありました。 perl はコマンドラインでも指定されているかどうかを調べて、 指定されていないときにだけ die するようになりました [RT #67880]。
5.10.0 で、ある種の再入可能な正規表現によってクラッシュしたり、 以下のアサーション失敗を出力したりすることがありました [RT #60508]:
Assertion rx->sublen >= (s - rx->subbeg) + i failed
以前は入っていなかった Unicode Character Database からのファイルも 含むようになりました。
Perl は無名一時ファイルを開くときに TMPDIR
を使うようになりました。
Perl はものすごく移植性が高いです。 一般的に、あるプラットフォームに C コンパイラがあれば、誰かが Perl を移植しています (あるいはそのうちに移植します)。 私たちは、Perl 5.12 でいくつかの新しいプラットフォームに対応したことを 喜んでお伝えいたします。 同時に、(とても)古い友人のいくつかに別れの挨拶をする時が来ました。
Perl の開発者は Haiku 管理者からのパッチをマージしました。 Perl は Haiku でビルドできるようになったはずです。
Perl は MirOS BSD でビルドできるようになったはずです。
AIX 5L と 6.1 のための libbsd が取り除かれました。 flock()
だけが libbsd を使っていました。
libgdbm < 1.8.3-5 がインストールされている場合、 AIX 5L and 6.1 のための libgdbm が取り除かれました。 libgdbm は AIX Toolbox の追加パッケージとして配布されています。 残念ながらバージョン 1.8.3-5 以前のものは壊れています。
AIX 4.2 で再び動作するようにヒントが変更されました。
Cygwin 1.7 以降で IPv6 に対応しました。
Cygwin においては、DLL から最後の番号を取り除くことにしました。 これは何年間も cygwin.com のビルドの振る舞いとなっています。 ヒントファイルが更新されました。
まだバグっぽいので、Darwin 10 (Mac OS X 10.6) での be_BY.CP1131 ロケールの テストはスキップするようになりました。
Darwin 8 と 9 (それぞれ Mac OS X 10.4 と 10.5) でのバグっぽいロケールを 識別するために使われている正規表現での問題を修正しました。
スレッドライブラリ選択が修正されました。 [perl #69686]
ヒントファイルは FreeBSD 7 以降での正しいスレッドライブラリを 識別するようになりました。
Irix 6.5 コンパイラのプリプロセッサにある奇妙なバグを回避するように なりました: cc -E -
は残念ながら K&R モードになりますが、cc -E file.c
では なりません。
ヒントがバージョン 5.* に対応しました。
-UDEBUGGING
は VMS でのデフォルトとなりました。
長年をかけて、他のどの場所でも同じようになっています。 また、make コマンドラインでの -UDEBUGGING と -DDEBUGGING は configure.com で動作します; 以前はこれを無効にする方法は対話的質問に no を答えることだけでした。
VMS のデフォルトのパイプバッファサイズは、64 ビットシステムでは 8192 に更新されました。
PerlIO::scalar
のメモリ内一時ファイルからの読み込みは、 $/
が(レコード風読み込みを示すために)数値リファレンスにセットされていると 失敗していました。 これは修正されました。
VMS が getgrgid
に対応するようになりました。
VMS ファイル名の扱いと変換に関するコードに対して多くの改良と整理が 行われました。
論理名 PERL_VMS_POSIX_EXIT
を有効にすることで、VMS 条件値を POSIX 返りステータスに変換し、GNV の bash シェルやその他の POSIX 返り値に 依存しているユーティリティとの相互作用を高めます。 詳細については "$?" in perlvms を参照してください。
File::Copy
は VMS の Unix 互換モードを検出するようになりました。
Stratus からの様々な変更がマージされました。
Symbian S60 3.2 SDK と S60 5.0 SDK に対応するようになりました。
Perl 5.12 は Windows 2000 以降に対応します。 Windows のレガシー版に対応するコードもまだ含まれていますが、 次の開発サイクルで削除される予定です。
Perl を MinGW-w64 で Perl をビルドするための初期サポートが 利用可能です。
perl.exe は、Windows Vista 以降のための trustInfo
設定を 指定するためのマニフェストリソースを含むようになりました。 この設定なしでは、Windows は perl.exe をレガシー アプリケーションとして扱い、("Program Files" フォルダのような) 保護されたファイルシステムエリアへのアクセスを、 適切な "permission denied" エラーを生成するのではなく、 ユーザーの "VirtualStore" にリダイレクトする、と言った、様々な 発見的な動作を適用します。
また、マニフェストリソースは Microsoft コモンコントロールバージョン 6.0 (Windows XP で導入されたテーマ対応版) を要求します。 レガシーアプリケーションのための古い形式のテーマ非対応版に 戻すには、CPAN の Win32::VisualStyles モジュールをチェックしてください。
-t
ファイルテスト演算子は、ファイルハンドルがコンソールウィンドウに 接続されている場合にのみ真を返します。 以前のバージョンの Perl では、NUL と LPT1 を含む、全ての キャラクタモードデバイスにおいて真を返します。
-p
ファイルテスト演算子は正しく動作するようになり、また、 Perl が Microsoft Visual C でコンパイルされたときには Fcntl::S_IFIFO 定数が定義されるようになりました。 以前のバージョンの Perl では -p
は常に偽の値を返し、 Fcntl::S_IFIFO 定数は定義されていませんでした。
このバグは Microsoft Visual C 固有で、MinGW でビルドされた Perl バイナリには影響ありません。
ソケットのエラーコードにより広く対応するようになりました: POSIX モジュールは POSIX::EWOULDBLOCK のようなシンボリックな名前を 定義するようになり、$! のソケットエラーコードの文字列化も 動作するようになりました;
C:\>perl -MPOSIX -E "$!=POSIX::EWOULDBLOCK; say $!"
A non-blocking socket operation could not be completed immediately.
flock() は実用的なエラーコードを $! にセットするようになりました。 以前のバージョンの Perl は $^E の値を $! にコピーしていたので、 多くの混乱を引き起こしていました。
select() は全ての空 fd_set
をより正しく対応するようになりました。
do
と require
において、'.\foo'
と '..\foo'
が './foo'
と '../foo'
とは異なって扱われていました [RT #63492]。
メッセージウィンドウの扱いが改良され、alarm
と kill
のメッセージが 競合状態でも欠落しなくなりました。
Perl のビルド基盤のさまざまな部分で、もはやリリース時に win32 用の 行末に変換しなくなりました。 もしこれが問題になる場合は、perl に含まれている perlbug プログラムで 問題を報告してください。
以下はいくつかの重要な未修正のバグの一覧で、5.10.x か 5.8.x からの 退行です。
../../cpanp-run-perl がビルドディレクトリの外にある場合、 いくつかの CPANPLUS テストが失敗します。 失敗しても、実際のソフトウェアに問題があるというわけではないはずです。 このバグは [RT #74188] で既に修正されていて、perl-v5.12.1 に 含まれる予定です。
List::Util::first
は (典型的には my $_
や given
による) レキシカルな $_
の存在について振る舞いを間違えていました。 each の反復で設定される変数はレキシカルな $_
ではなくパッケージ変数の $_
です [RT #67694]。
同様の問題は、以下のように、最初の引数としてブロックを取る関数を提供している その他のモジュールにも発生するかもしれません。
foo { ... $_ ...} list
正規表現によっては、パターンをコンパイルしたスレッドで実行するのに比べて 子スレッドではとても遅くなることがあります [RT #55600]。
"\N{LATIN SMALL LIGATURE FF}" =~ /\N{LATIN SMALL LETTER F}+/
の ようなものは、とても長い実行ループに入るので、ハングアップしたかのように 見えます [RT #72998]。
何人かの移植担当者が、ある種の Windows 2000 システムでビルドした後 Perl のテストスイート全体を実行すると、なぜかクラッシュすると 報告しています。 手動で実行した場合は、個々のテストは正しく動作します。
これは実際には 5.10.0 で導入された変更ですが、5.10.0 の perldelta からは 漏れているので、代わりにここで言及します。
/m
修飾子と qr
の扱いに関するバグ修正の結果、5.8.x と 5.10.0 で 振る舞いが変わっています:
# matches in 5.8.x, doesn't match in 5.10.0
$re = qr/^bar/; "foo\nbar" =~ /$re/m;
Perl 5.12.0 は、Perl 5.10.0 以降、200 人以上の作者とコミッタによって、 3,000 以上のファイルに 750,000 行以上の変更を加えて、 ほぼ 2 年間開発されてきました。
Perl は、活気のあるユーザーと開発者のコミュニティのおかげで 20 年を超えて繁栄しています。 以下の人々が、Perl 5.12.0 になるための改良に貢献したことが 分かっています:
Aaron Crane, Abe Timmerman, Abhijit Menon-Sen, Abigail, Adam Russell, Adriano Ferreira, Ævar Arnfjörð Bjarmason, Alan Grover, Alexandr Ciornii, Alex Davies, Alex Vandiver, Andreas Koenig, Andrew Rodland, andrew@sundale.net, Andy Armstrong, Andy Dougherty, Jose AUGUSTE-ETIENNE, Benjamin Smith, Ben Morrow, bharanee rathna, Bo Borgerson, Bo Lindbergh, Brad Gilbert, Bram, Brendan O'Dea, brian d foy, Charles Bailey, Chip Salzenberg, Chris 'BinGOs' Williams, Christoph Lamprecht, Chris Williams, chromatic, Claes Jakobsson, Craig A. Berry, Dan Dascalescu, Daniel Frederick Crisman, Daniel M. Quinlan, Dan Jacobson, Dan Kogai, Dave Mitchell, Dave Rolsky, David Cantrell, David Dick, David Golden, David Mitchell, David M. Syzdek, David Nicol, David Wheeler, Dennis Kaarsemaker, Dintelmann, Peter, Dominic Dunlop, Dr.Ruud, Duke Leto, Enrico Sorcinelli, Eric Brine, Father Chrysostomos, Florian Ragwitz, Frank Wiegand, Gabor Szabo, Gene Sullivan, Geoffrey T. Dairiki, George Greer, Gerard Goossen, Gisle Aas, Goro Fuji, Graham Barr, Green, Paul, Hans Dieter Pearcey, Harmen, H. Merijn Brand, Hugo van der Sanden, Ian Goodacre, Igor Sutton, Ingo Weinhold, James Bence, James Mastros, Jan Dubois, Jari Aalto, Jarkko Hietaniemi, Jay Hannah, Jerry Hedden, Jesse Vincent, Jim Cromie, Jody Belka, John E. Malmberg, John Malmberg, John Peacock, John Peacock via RT, John P. Linderman, John Wright, Josh ben Jore, Jos I. Boumans, Karl Williamson, Kenichi Ishigaki, Ken Williams, Kevin Brintnall, Kevin Ryde, Kurt Starsinic, Leon Brocard, Lubomir Rintel, Luke Ross, Marcel Grünauer, Marcus Holland-Moritz, Mark Jason Dominus, Marko Asplund, Martin Hasch, Mashrab Kuvatov, Matt Kraai, Matt S Trout, Max Maischein, Michael Breen, Michael Cartmell, Michael G Schwern, Michael Witten, Mike Giroux, Milosz Tanski, Moritz Lenz, Nicholas Clark, Nick Cleaton, Niko Tyni, Offer Kaye, Osvaldo Villalon, Paul Fenwick, Paul Gaborit, Paul Green, Paul Johnson, Paul Marquess, Philip Hazel, Philippe Bruhat, Rafael Garcia-Suarez, Rainer Tammer, Rajesh Mandalemula, Reini Urban, Renée Bäcker, Ricardo Signes, Ricardo SIGNES, Richard Foley, Rich Rauenzahn, Rick Delaney, Risto Kankkunen, Robert May, Roberto C. Sanchez, Robin Barker, SADAHIRO Tomoyuki, Salvador Ortiz Garcia, Sam Vilain, Scott Lanning, Sébastien Aperghis-Tramoni, Sérgio Durigan Júnior, Shlomi Fish, Simon 'corecode' Schubert, Sisyphus, Slaven Rezic, Smylers, Steffen Müller, Steffen Ullrich, Stepan Kasal, Steve Hay, Steven Schubiger, Steve Peters, Tels, The Doctor, Tim Bunce, Tim Jenness, Todd Rinaldo, Tom Christiansen, Tom Hukins, Tom Wyant, Tony Cook, Torsten Schoenfeld, Tye McQueen, Vadim Konovalov, Vincent Pit, Hio YAMASHINA, Yasuhiro Matsumoto, Yitzchak Scott-Thoennes, Yuval Kogman, Yves Orton, Zefram, Zsban Ambrus
これはバージョンコントロール履歴から自動的に生成しているので、 悲惨なほどに不完全です。 特に、Perl 5.12.0 をよりよくするための助けとなった、以前のバージョンの Perl の問題を報告してくれた(とてもありがたい)貢献者の名前を含んでいません。 全ての Perl の歴史的な貢献者のより完全な一覧はについては、 どうか Perl 5.12.0 配布に含まれている AUTHORS
を参照してください。
私たちの「引退した」パンプキングである Nicholas Clark と Rafael Garcia-Suarez は、素晴らしく現実的に継続されている貢献に対して 特別な感謝に値します。 Nicholas は個人的に、5.10.0 以降のパッチの 30% 以上を書いています。 Rafael はパッチの量では 11% で 2 位ですが、他の人が書いたパッチの コミット量では断トツの 1 位で、5.10.0 以降この分野ではコミットの 44% が 彼のものです; これはしばしばパッチ作者への少なからぬ指導の後のものです。 これらの統計資料は彼らの貢献の全てを表すには全く不足していますが、 彼らなしではリリースできなかったことを手短に表現しています。
このバージョンに含まれている変更の多くは、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 コアのセキュリティ問題だけに使ってください。
変更点の完全な詳細を見る方法については Changes ファイル。
Perl のビルド方法については INSTALL ファイル。
一般的なことについては README ファイル。
著作権情報については Artistic 及び Copying ファイル。
http://dev.perl.org/perl5/errata.html には、このリリース以降に 発見された問題や、このリリースと互換性のないとわかった CPAN モジュールの 一覧があります。