\N{...}
での不明な文字名は文法エラーになりました\N{}
文字名別名での文字はエラーになるようになりました\N{BELL}
は U+0007 ではなく U+1F514 を参照するようになりました/(?{})/
と /(??{})/
は大幅に再作業されましたgiven
はグローバルな $_
のエイリアスになりました$_
は実験的なものになりました$/ = \N
での readline() は N バイトではなく N 文字を読み込むようになりましたglob
は一つの引数を渡すようになりましたstate sub
と our sub
require
は die しますgv_fetchmeth_*
と SUPERsplit
の最初の引数はより一貫性を持って解釈されるようになりましたperl5180delta - perl v5.18.0 での変更点
この文書は v5.16.0 リリースと v5.18.0 リリースの変更点を記述しています。
v5.14.0 のような以前のリリースから更新する場合は、まず v5.14.0 と v5.16.0 の違いについて記述している perl5160delta を読んでください。
新しく追加された実験的機能には以下の決まり文句が必要になりました:
no warnings "experimental::feature_name";
use feature "feature_name"; # would warn without the prev line
"experimental" と呼ばれる新しい警告カテゴリができました; 実験的機能が 有効になったときに feature プラグマによって出力される警告が含まれます。
新しく追加された実験的機能はまた、"experimental::" に引き続いて機能の 名前からなる特殊な警告 ID が与えられます。 (計画では、この機構は最終的には全ての警告に拡張され、単にカテゴリ単位でなく、 ここに有効にしたり無効にしたりできるようになります。)
以下のようにすると
no warnings "experimental::feature_name";
あなたはこの機能の将来の変更や削除が引き起こすかも知れないあらゆる破損に 責任を持つことになります。
(~~
や my $_
のような) 一部の機能は実験的警告を出力するようになり、 またこれらの警告カテゴリを認識しない perl でも実行するコードでこれらを 無効にしたいかもしれないので、以下のように if
プラグマを使うことを 考慮してください:
no if $] >= 5.018, 'warnings', "experimental::feature_name";
既にある実験的機能もこれらの警告を出力し始めるようになります。 どの機能が実験的と考えられているかに関する情報については perlexperiment を 参照してください。
perl v5.18.0 でのハッシュの実装の変更は、既存のコードの振る舞いに対して もっとも目に見える変更の一つです。
デフォルトでは、同じキーと値を持つ二つの異なったハッシュ変数は、 以前は同じであったところで異なった順序で内容を提供するようになります。
これらの変更に遭遇したら、きれいにする鍵は、ハッシュは順番のない集合 と いうことを受け入れてそれに従って動作することです。
Perl のハッシュ関数が使う種はランダムになりました。 これは、keys()
, values()
, each()
のような関数が返すキー/値の 順序は実行毎に異なるということです。
この変更は、アルゴリズム的複雑性攻撃から Perl ハッシュをより堅牢に することと、ハッシュの順序に依存したバグが発見され、これによってより容易に 突き止められることが分かったからです。
ツールチェーンのメンテナはこのようなことに対してテストするための追加の 基盤に投資したいかもしれません。 テストを連続して何回か実行してから結果を比べることで、コード中の ハッシュ順への依存を見つけ出すのがより容易になります。 作者は Perl のハッシュのキーの順序を安全でない聴衆に公開しないように強く 勧めます。
さらに、それぞれのハッシュは独自の反復順序を持ちます; これにより、現在の ハッシュの種が何かを決定するのが遥かに難しくなります。
Perl v5.18 は複数のハッシュ関数への対応を含んでいて、デフォルトが (ONE_AT_A_TIME_HARD に) 変更され、コンパイル時にシンボルを定義することで 異なるアルゴリズムを選べます。 現在の一覧については、INSTALL 文書に当たってください。 Perl v5.18 現在、私たちはデフォルトまたは SIPHASH の使用のみを 推奨していることに注意してください。 そのほか全てはセキュリティ問題があることが知られていて、研究目的のため だけのものです。
PERL_HASH_SEED
は整数を引数として受け付けなくなりました; 代わりに値は "0xf5867c55039dc724" のような、16 進文字列でエンコードされたバイナリ値を 想定するようになりました。 これは整数を超えるかも知れないイン井の長さのハッシュの種に対応する基盤を 作るためです。 (SipHash は 16 バイトの種を使います。)
PERL_PERTURB_KEYS
環境変数は keys
およびその親類に適用されるランダム化の レベルを制御出来ます。
PERL_PERTURB_KEYS
が 0 なら、perl はキー順序を全くランダム化しません。 挿入によって keys
が変更される機会は以前の perl と同じで、基本的に バケツサイズが変わるときだけです。
PERL_PERTURB_KEYS
が 1 なら、perl は再現出来ない方法でキーを ランダム化します。 挿入によって keys
が変更される機会はとても高いです。 これはもっとも安全でデフォルトのモードです。
PERL_PERTURB_KEYS
が 2 なら、perl はキーを再現可能な方法で ランダム化します。 同じプログラムを繰り返し実行すると毎回同じ出力を生成します。
PERL_HASH_SEED
は非デフォルトの PERL_PERTURB_KEYS
設定という意味を 含みます。 PERL_HASH_SEED=0
(正確に一つの 0) に設定すると PERL_PERTURB_KEYS=0
(ハッシュキーランダム化の無効化) という意味を含みます; PERL_HASH_SEED
をその他の値に設定すると、PERL_PERTURB_KEYS=2
(決定的で 再現可能なハッシュキーランダム化) という意味を含みます。 明示的に PERL_PERTURB_KEYS
を異なったレベルに指定するとこの振る舞いを 上書きします。
Hash::Util::hash_seed() は整数ではなく文字列を返すようになりました。 これは整数を超えるかも知れない任意の長さのハッシュの種に対応する基盤を 作るためです。 (SipHash は 16 バイトの種を使います。)
環境変数 PERL_HASH_SEED_DEBUG は、perl がビルドされたハッシュ関数 および、 そのプロセスで使っている種の 16 進表記の両方を表示するようになりました。 この出力をパースするコードは、存在するはずですが、新しい形式に適合するように 変更しなければなりません: 新しい形式の例は:
$ PERL_HASH_SEED_DEBUG=1 ./perl -e1
HASH_FUNCTION = MURMUR3 HASH_SEED = 0x1476bb9f
Perl は Unicode 6.2 に対応するようになりました。 Unicode 6.1 からの変更点の一覧は http://www.unicode.org/versions/Unicode6.2.0 にあります。
\N{...}
, charnames::vianame()
などで使うための文字に対する独自の名前を 定義することができます。 これらの名前は Unicode の範囲全体の文字で構成できるようになりました。 これにより、名前に英語だけでなくネイティブな名前を付けられるようになります。 使える文字にはある種の制限が適用されます (例えば、句読点を含む名前は 定義できません)。 "CUSTOM ALIASES" in charnames を参照してください。
以下の新しい DTrace プローブが追加されました:
op-entry
loading-file
loaded-file
${^LAST_FH}
この新しい変数は、最後に読み込んだファイルハンドルへのアクセスを提供します。 これは、$.
および、引数なしの tell
および eof
で使われる ハンドルです。
これは、Unicode::Regex::Set と同様に、符号位置の集合の和集合、 共有集合などに対してマッチングできるようにする 実験的な 機能です。 これはまた拡張 /x
処理を [大かっこ] 文字クラスで使えるようにし、 ユーザー定義特性の代わりとして、それがするよりも複雑な式が可能になりました。 "Extended Bracketed Character Classes" in perlrecharclass を参照してください。
この新機能はまだ 実験的 と考えられています。 有効にするには:
use 5.018;
no warnings "experimental::lexical_subs";
use feature "lexical_subs";
state sub foo
, my sub foo
, our sub foo
でサブルーチンを 宣言できます。 (state sub
は、CORE::state sub foo
と書かない限り、"state" 機能が 有効であることが必要です。)
state sub
は、宣言されたレキシカルスコープから見えるサブルーチンを 作ります。 このサブルーチンは外側のサブルーチンからの呼び出しの間で共有されます。
my sub
は、閉じブロックに入る毎に作成されるレキシカルなサブルーチンを 宣言します。 state sub
は一般的に my sub
より少し高速です。
our sub
は、同じ名前のパッケージサブルーチンへのレキシカルな別名を 宣言します。
さらなる情報については、"Lexical Subroutines" in perlsub を参照してください。
ループ制御 next
, last
, redo
および特殊な dump
演算子は、 実行時にラベルを計算するために使えるように、任意の式を使えるように なりました。 以前は、定数以外の任意の引数は空文字列として扱われていました。
いくつかの組み込み関数が CORE:: 名前空間のサブルーチンとして追加されました - つまり、以下の、カスタムパーサなしで実装可能なオーバーライドできない キーワードです: defined
, delete
, exists
, glob
, pos
, protoytpe
, scalar
, split
, study
, undef
。
これらの一部はプロトタイプを持ち、prototype('CORE::...')
は オーバーライドできるキーワードとできないキーワードで違いが起きないように 変更されました。 これは prototype('CORE::pos')
が prototype(&CORE::pos)
と一貫性を 持つようにするためです。
kill
kill
は常に負のシグナル番号が使えて、その場合単一のプロセスではなく プロセスグループを kill します。 そしてシグナル名も使えました。 しかしこれは一貫性のある振る舞いではありませんでした; なぜなら負の シグナル名は0 として扱われていたからです。 -INT
のような負のシグナル名に対応するようになり、-2 を指定されたのと 同じように扱います [perl #112990]。
"Hash overhaul" の変更の一部はセキュリティを向上させています。 当該の節を参照してください。
Storable
セキュリティ警告Storable
の文書に、信頼できないソースから Storage データを受け付けることの 危険性を読者に警告する章が追加されました。 短く言うと、ある種のデータをデシリアライズすると、モジュールの読み込みや その他のコード実行を引き起こすことがあります。 これは文書化された振る舞いであり求められている振る舞いですが、これは 悪意ある実体からの攻撃が可能です。
Locale::Maketext
が不正なテンプレートによってコードインジェクションを許していましたユーザーが Locale::Maketext に変換文字列を提供できると、現在のプロセスで 利用可能な任意の Perl サブルーチンを起動することができました。
これは修正されましたが、Locale::Maketext
自身や、使っているサブクラスで 提供されている任意のメソッドを起動することが可能です。 これらのメソッドの一つは、Perl コアの sprintf
サブルーチンを 起動できます。
まとめると、監査なしにユーザーに変換文字列を提供させるのは悪い考えです。
この脆弱性は CVE-2012-6329 として記録されました。
perl の x
文字列繰り返し演算子のカウントを攻撃者が指定できるような 不適切に書かれたコードは、メモリ枯渇サービス拒否攻撃を引き起こしていました。 v5.15.5 以前のバージョンの欠点により、これがヒープバッファオーバーランに 昇格していました; 2.16 以前のバージョンの glibc では、任意のコードの実行を 許す可能性がありました。
これに関わる欠点は識別子 CVE-2012-5195 が割り当てられ、Tim Brown によって 調査されました。
"Hash overhaul" の変更の一部は以前のバージョンの perl との 完全な互換性はありません。 当該の節を参照してください。
\N{...}
での不明な文字名は文法エラーになりました以前は、これは警告され、Unicode REPLACEMENT CHARACTER に 置き換えられていました。 Unicode は今ではこのような状況では文法エラーにすることを勧めています。 また、以前の振る舞いは一部の混乱させる警告と振る舞いを引き起こし、 REPLACEMENT CHARACTER は一部の不明な文字の代わり以外に使い道がないので、 この問題を持つコードはバグがちです。
\N{}
文字名別名での文字はエラーになるようになりましたv5.12.0 から、ユーザー定義 \N{...}
文字名での一部の文字の使用は 廃止予定になりました。 これらは文法エラーになりました。 例えば、以下のように数値で始まる名前はエラーになります
my $undraftable = "\N{4F}"; # Syntax error!
あるいは名前のどこかにカンマがある場合もそうです。 "CUSTOM ALIASES" in charnames を参照してください。
\N{BELL}
は U+0007 ではなく U+1F514 を参照するようになりましたUnicode 6.0 は "BELL" という名前を、伝統的に使われていたものと異なる 符号位置に再利用しました。 Perl v5.14 から、この名前を使っても U+0007 を参照したままでしたが、 廃止予定警告が出ていました。 今では、"BELL" は U+1F514 を参照し、U+0007 の名前は "ALERT" になりました。 charnames の全ての関数はこれに対応するように更新されました。
Unicode は、正規表現で単一の文字が大文字小文字を無視して複数の文字に マッチングできるとき、自動的に大文字小文字を扱うという以前の推奨を 取り下げました; 例えば、LATIN SMALL LETTER SHARP S と並び ss
です。 これは、どのような状態でもこれを正しく行うのは不可能であるということが 分かったからです。 Perl はこれをできるだけしようとするので、引き続きそうします。 (私たちはこれをオフにするオプションを考慮しています。) しかし、[大かっこ] 文字クラスでこのようなマッチングが起きるときの新しい制限が 追加されていました。 人々は /[\0-\xff]/i
なものを指定して、二文字並び ss
にマッチングして 驚いていました (LATIN SMALL LETTER SHARP S はこの範囲にあるからです)。 この振る舞いは範囲ではなく特性を使った場合と一貫性がありません: \p{Block=Latin1}
は LATIN SMALL LETTER SHARP S も含みますが、 /[\p{Block=Latin1}]/i
は ss
にマッチングしません。 新しい規則は、大かっこ文字クラス内での複数文字大文字小文字無視マッチングに 関するもので、文字は明示的に一覧に挙がっていなければならず、範囲の 端点であってはなりません。 これはより密接に驚き最小の原則に従います。 "Bracketed Character Classes" in perlrecharclass を参照してください。 バグ [perl #89774] はこの変更の一部として修正され、以前の振る舞いが 完全に動作することを妨げることに注意してください。
不注意により、5.16 での単一文字の変数名は完全に無制限になっていました。 これは様々な種類の狂気への扉を開いていました。 v5.18 から、その他の識別子の規則に従って、さらに \p{POSIX_Punct}
特性に マッチングする文字を受け付けます。
もはや中かっこありと中かっこなしで指定された識別子のパースに違いは ありません。 例えば、perl は (シングルコロン付きの) ${foo:bar}
は許していましたが $foo:bar
は許していませんでした。 今では両方とも単一のコードパスで扱われ、どちらも同じ方法で扱われます: どちらも禁止されます。 この変更は許可されるリテラルな識別子の範囲に関するものであり、その他の式には 関係ないことに注意してください。
なぜ \s
で垂直タブ \cK
にマッチングしないのか、誰も 思い出せませんでした。 今ではマッチングします。 この文字自体がとても稀なので、破損はほとんど起こらないと想定されています。 つまり、これは以下を意味します:
正規表現中の \s
は全ての状況で垂直タブにマッチングするようになりました。
正規表現中のリテラルな垂直タブは、/x
修飾子が使われると無視されます。
単独または他の空白と混ぜられた先頭の垂直タブは、文字列を数値として 解釈するときに無視されるようになりました。 例えば:
$dec = " \cK \t 123";
$hex = " \cK \t 0xF";
say 0 + $dec; # was 0 with warning, now 123
say int $dec; # was 0, now 123
say oct $hex; # was 0, now 15
/(?{})/
と /(??{})/
は大幅に再作業されましたこの機能の実装はほとんど完全に書き直されました。 主な目的はバグの修正ですが、一部の振る舞い、特にレキシカル変数に関連する ものは変更されました。 これは "Selected Bug Fixes" の節でより完全に記述されています。
パーサが s///e
を以下のようにパースすることを悪用することはもはや できなくなりました:
%_=(_,"Just another ");
$_="Perl hacker,\n";
s//_}->{_/e;print
given
はグローバルな $_
のエイリアスになりましたgiven
は、ちょうど foreach
と同様に、暗黙のレキシカルな $_
ではなく グローバルな $_
を引数への別名とするようになりました。 しかし、(再び foreach
と同様に) レキシカルな $_
がスコープ内にあれば レキシカルな $_
を使います [perl #114020]。
v5.10.0 で追加され、v5.10.1 で大きく改訂されたスマートマッチングは、 いつも不満な点でした。 これを有用にする方法はいくつかありますが、問題があり、Perl のユーザーと 実装者の両方を混乱させることがわかっています。 この問題をもっともよく対処するための多くの提案がありました。 スマートマッチングは将来変更されるか削除されることはほぼ確実です。 現在の振る舞いに依存することは勧められません。
パーサが ~~
, given
, when
を見つけたときに警告が 発生するようになりました。 これらの警告を無効にするには、適切なスコープに以下の行を追加できます:
no if $] >= 5.018, "experimental::smartmatch";
しかし、振る舞いは安定するまでに再び変更されるかもしれないので、これらの 機能の使用を置き換えることを考慮してください。
$_
は実験的なものになりましたこれが Perl v5.10 で導入されてから、明らかな解決方法のない多くの混乱を 引き起こしていました:
様々なモジュール (例えば List::Util) はコールバックルーチンがグローバルな $_
を使うことを想定しています。 use List::Util 'first'; my $_; first { $_ == 1 } @list
は想定通りに 動作しません。
同じファイルのより前にある my $_
宣言は混乱したクロージャ警告を 引き起こすことがあります。
"_" サブルーチンプロトタイプ文字は呼び出しサブルーチンがレキシカルな $_
にアクセスできるようにするので、実際には全く プライベートではありません。
それにも関わらず、"(@)" プロトタイプを持つサブルーチンおよびメソッドは、 XS で書かれいないかぎり呼び出し元のレキシカル $_
にアクセスできません。
しかし XS ルーチンでも呼び出し側のサブルーチンで宣言された レキシカルな $_
にはアクセスできません; サブルーチンがたまたま $_
に言及したり デフォルトが $_
であるような演算子を使っていなかった場合のみ、 外側のスコープのものにはアクセスできます。
レキシカルな $_
が復旧可能であるというのは私たちの希望ですが、これは 振る舞いの変更を引き起こすでしょう。 安定するまで、注意して使ってください。
$/ = \N
での readline() は N バイトではなく N 文字を読み込むようになりました以前は、encoding
のような I/O 層を使ってストリームから読み込むとき、 readline() 関数、あるいは <>
演算子と知られているものは、 最上位の層から N バイト読み込んでいました。 [perl #79960]
代わりに N 文字読み込まれるようになりました。
追加の層なしでストリームから読み込むときには振る舞いは変わりません; なぜなら バイトは正確に文字にマッピングされるからです。
glob
は一つの引数を渡すようになりましたglob
をオーバーライドしたものは、呼び出し元を識別するマジカルで 文書化されていない第 2 引数を渡されていました。 CPAN でこれを使っているものはなく、バグ修正の邪魔になるので、 取り除かれました。 どうしても呼び出し元を識別する必要があるなら、CPAN の Devel::Callsite を 参照してください。
クォート風演算子の内側のヒヤドキュメントの本体は、常に "<<foo" マーカーの 次の行から始まるようになりました。 以前は、クォート風演算子を含む行の次の行から始まると文書化されていましたが、 これは時々しか正しくありませんでした [perl #114040]。
もはや以下のようには書けなくなりました:
m/a/and 1
代わりに以下のように書かなければなりません
m/a/ and 1
演算子を正規表現の閉じ区切り文字と分けるための空白が必要です。 空白がないと、Perl v5.14.0 から廃止予定警告が出ます。
qw
リストは、常にかっこで囲まれているとパーサが考えるように騙すために 使われていました。 これにより、実際には foreach $x (qw(a b c)) {...}
と書くべきところで foreach $x qw(a b c) {...}
のような驚かされる構文が可能でした。 これは時々構文解析器を間違った状態にするので、完全には動作せず、 許されると想定するかも知れない似たような foreach qw(a b c) {...}
は 全く動作しませんでした。
qw
のこの副作用は撤廃されました。 これは Perl v5.13.11 から廃止予定でした。 文法が必要としているところではどこでも、実際のかっこを使うことが 必要になりました。
何らかのレキシカル警告をオンにするとき、レキシカル警告が既に有効でなければ、 まず全てのデフォルト警告を無効にしていました:
$*; # deprecation warning
use warnings "void";
$#; # void warning; no deprecation warning
debugging
, deprecated
, glob
, inplace
, malloc
の警告カテゴリは、 レキシカルな警告がオンになったときにも (もちろん no warnings
で オフにしない限り) オンのままになりました。
これは、警告が出ていなかったコードで廃し予定警告を引き起こすかもしれません。
これらはデフォルト警告からなるカテゴリのみです。 その他のカテゴリのデフォルト警告はやはり use warnings "category"
で 無効化されます; なぜなら個々の警告を制御する基盤はまだないからです。
state sub
と our sub
歴史上の偶然により、state sub
と our sub
は普通の sub
と 等価だったため、our sub { ... }
で無名サブルーチンが作れていました。 これらは "lexical_subs" 機能の外側では出来なくなりました。 "lexical_subs" 機能の元ではこれらは "Lexical Subroutines" in perlsub に 記述されている新しい意味を持ちます。
環境変数に保管される値は常に文字列化されていました。 このリリースから、バイト文字列にだけ変換されます。 まず、文字列だけに強制されます。 それから、文字列が utf8 で utf8::downgrade()
の等価物が動作するなら、 結果が使われます; さもなければ、utf8::encode()
の等価物が使われ、 ワイド文字に関する警告が出力されます ("Diagnostics")。
require
は die しますrequire
が読み込めないファイルに遭遇すると、die するようになりました。 以前はそのファイルを無視して、@INC
のディレクトリの検索を続けていました [perl #113422]。
gv_fetchmeth_*
と SUPER様々な gv_fetchmeth_*
XS 関数は、名前が ::SUPER
で終わるパッケージを 特別扱いしていました。 Foo::SUPER
パッケージでのメソッド検索は Foo
パッケージでの SUPER
メソッドとして扱われていました。 これはもはや起こりません。 SUPER
を検索するには、Foo
スタッシュと GV_SUPER
フラグを 渡してください。
split
の最初の引数はより一貫性を持って解釈されるようになりましたv5.17 の初期でのいくつかの変更の後、split
の振る舞いは単純化されました: PATTERN 引数が一つのスペースを含む文字列として評価される場合、一つの スペースを含んでいる リテラルな 文字列であったように扱われます。
以下のモジュールは将来のリリースでコア配布から削除され、代わりに CPAN から インストールされる必要があるようになります。 これらが必要な CPAN 配布は依存モジュールにこれらを加える必要があります。
これらのモジュールのコア版を使うと、この事実を知らせるために "deprecated"
カテゴリの警告が発生するようになりました。 これらの廃止予定警告を黙らせるには、問題になっているモジュールを CPAN から インストールしてください。
(稀な例外はありますが) 使い続けることを奨励されている素晴らしいモジュールが あることに注意してください。 これらがコアに含まれなくなったのは、普通はその設計を考慮したためではなく、 主に完全に機能する、CPAN が使える Perl のインストールのブートストラッピングへの 必要性によって決まります。
このプラグマの使用は強く非推奨です。 これはソーステキストのエンコーディングと I/O データのエンコーディングを 融合し、ソーステキストのエスケープシーケンスを再解釈し(疑問のある選択です)、 全ての実行時の文字列の扱いに UTF-8 バグを導入します。 これは意図的に壊れていて、直すにはほど遠いです。
ソーステキストに非 ASCII リテラル文字を使うには、どうか utf8 を 参照してください。 テキストの I/O データの扱いについては、どうか Encode と open を 参照してください。
CPANPLUS::*
モジュール以下のユーティリティは、関連するモジュールが廃止予定なので、将来のリリースで コア配布から削除されます。 適切な CPAN 配布からは利用可能なままです。
cpanp-run-perl
これは CPANPLUS
配布の一部です。
これは Pod::LaTeX
配布の一部です。
このインタプリタグローバルな変数はインタプリタ内の Perl オブジェクトの総数を 記録するために使われていました。 これはもはや保守されず、Perl v5.20 で削除される予定です。
/x
では追加で五つの文字にエスケープが必要になりました正規表現パターンが /x
付きでコンパイルされるとき、Perl は SPACE や TAB などの 6 文字を無視する空白として扱います。 しかし、Unicode は 11 文字をそう扱うように勧めています。 私たちはこれを将来の Perl バージョンで従う予定です。 当面の間、抜けている文字の使用は、オフにされていない限り廃止予定警告を 引き起こします。 五つの文字とは以下の通りです:
U+0085 NEXT LINE
U+200E LEFT-TO-RIGHT MARK
U+200F RIGHT-TO-LEFT MARK
U+2028 LINE SEPARATOR
U+2029 PARAGRAPH SEPARATOR
末尾や連続した空白を含むユーザー定義文字名はおそらくタイプミスです。 多すぎる空白を含むことはなさそうという仮定の下、このようなものを定義すると 警告が出るようになりました。
文字をクラス分けする全ての関数は将来のバージョンの Perl から削除されるので、 使うべきではありません。 これらのいずれかを使っているファイルをコンパイルすると、 (例えば gcc のような) 関連する C コンパイラは警告を生成します。 これらは公的な使用を想定していません; これらのほとんどに対しては、等価でより 高速なマクロがあります。
"Character classes" in perlapi を参照してください。 完全な一覧は:
is_uni_alnum
, is_uni_alnumc
, is_uni_alnumc_lc
, is_uni_alnum_lc
, is_uni_alpha
, is_uni_alpha_lc
, is_uni_ascii
, is_uni_ascii_lc
, is_uni_blank
, is_uni_blank_lc
, is_uni_cntrl
, is_uni_cntrl_lc
, is_uni_digit
, is_uni_digit_lc
, is_uni_graph
, is_uni_graph_lc
, is_uni_idfirst
, is_uni_idfirst_lc
, is_uni_lower
, is_uni_lower_lc
, is_uni_print
, is_uni_print_lc
, is_uni_punct
, is_uni_punct_lc
, is_uni_space
, is_uni_space_lc
, is_uni_upper
, is_uni_upper_lc
, is_uni_xdigit
, is_uni_xdigit_lc
, is_utf8_alnum
, is_utf8_alnumc
, is_utf8_alpha
, is_utf8_ascii
, is_utf8_blank
, is_utf8_char
, is_utf8_cntrl
, is_utf8_digit
, is_utf8_graph
, is_utf8_idcont
, is_utf8_idfirst
, is_utf8_lower
, is_utf8_mark
, is_utf8_perl_space
, is_utf8_perl_word
, is_utf8_posix_digit
, is_utf8_print
, is_utf8_punct
, is_utf8_space
, is_utf8_upper
, is_utf8_xdigit
, is_utf8_xidcont
, is_utf8_xidfirst
.
さらに、以下の三つの決して正しく動作しない関数が廃止予定になりました: to_uni_lower_lc
, to_uni_title_lc
, and to_uni_upper_lc
.
Perl が正規表現パターンのメタ文字として認識する 3 組の文字があります: {}
, []
, ()
です。 これらは以下のように区切り文字としても使えます:
m{foo}
s(foo)(bar)
これらはメタ文字なので、正規表現では特別な意味があります; そして これらの文字を区切り文字として使ったパターンの中で使うとき、逆スラッシュを 前置して通常の意味にすることで特別な意味をなくすということができないことが 分かりました。 例えば、以下のものは
m{foo\{1,3\}}
逆スラッシュは振る舞いを変更せず、これは "f o"
に引き続いて 1 から 3 文字の "o"
にマッチングします。
メタ文字として解釈される場所でのこのような使用法は極めて稀です; 例えば、 CPAN 全ての中で全く使われていません。 従って、この廃止予定はコードにほとんど影響を与えないはずです。 しかし、逆スラッシュが意味があるように将来の Perl バージョンの振る舞いを 変更したときに、このようなコードは変更する必要があり、黙って既存のコードを 壊す恐れがないように、ここで注意しておきます。
(?
または (*
を分割する(?...)
正規表現構文で (
と ?
が空白で分割されていると廃止予定警告が 発生するようになりました。 (*VERB...)
構文で (
と *
が分割されている場合も同様です。
理論的には、今のところ PerlIO なしで perl をビルドすることは可能です。 代わりに、stdio か sfio のラッパーを使います。 実際には、これはかなり不便です。 あまりテストされておらず、IO 層や(従って)Unicode に対応しておらず、 perl としていいものではありません。 PerlIO なしのビルドおそらく次のバージョンの perl で削除されます。
PerlIO は、stdio を使いたいなら stdio
層に対応しています。 同様に sfio 層も、もし必要なら将来作成されるかもしれません。
対応基盤のないプラットフォーム
Windows CE と z/OS は歴史的に管理下にありましたが、現在の所どちらも ビルドに失敗したり定期的にスモークテストされていなかったりします。 この状況を変えるための努力は行われていますが、これらのプラットフォームが 安全で対応していると認められるべきではありません。 ビルド可能になって定期的にスモークテストが行われない場合、これらへの対応は 将来のリリースで積極的に削除されるかもしれません。 これらのプラットフォームに興味があって、これらのプラットフォームを 助けるための時間、知識、ハードウェアがあるなら、perl5-porters@perl.org
に メールすることで perl 開発活動に知らせてください。
その他の完全に死んでいるように見える一部のプラットフォームも現在から v5.20.0 の間に削除される短い一覧に載っています:
私たちはまた、おそらく現在のバージョンの Perl はもはや AmigaOS, DJGPP, (ネイティブな) NetWare, OS/2, Plan 9 ではビルドできないと考えています。 もしあなたがこのようなプラットフォームで Perl を使っていて、これらでの Perl の未来を確実にすることに関心があるなら、どうか私たちに連絡してください。
私たちは、Perl は長い間 (PDP-11 のような) 混合エンディアンアーキテクチャでは ビルドできないと信じていて、残っている対応コードを削除するつもりです。 同様に、長い間保守されていない GNU dld に対応するコードも、誰も アクティブなユーザーとして知られることがなければ、もうすぐ 取り除かれるでしょう。
$< と $> の交換
Perl は 5.0 から、以下のように、一時的にパーミッションを落とすために $< と $> を(および同様に $( と $) を) 交換するという慣用句に対応しています:
($<, $>) = ($>, $<);
しかし、実ユーザー/グループ ID を変更するという、望ましくない副作用が あるかもしれないこの慣用句は、もはや perl が対応しているどの プラットフォームでも有用ではなく、これらの変数と一般的なリスト代入の 実装を複雑にしています。
代替策として、$>
だけに代入することを推奨します:
local $> = $<;
関連項目: Setuid Demystified。
長い間壊れていて存在理由がはっきりしない microperl
は削除されます。
ダブルクォート風文字列内で他のエスケープと組み合わされたときの "\Q"
の意味論の刷新。
\Q...\E
の組の中の \Q
と \x
, \L
などのようなエスケープとの 組み合わせに伴ういくつかのバグと非一貫性があります。 これらは修正される必要があり、そうするには現在の振る舞いを変える必要が あります。 変更はまだ確定していません。
$x
(ここで x
は任意の実際の (表示されない) C0 制御文字) の 使用は将来の Perl のバージョンでは認められなくなります。 代わりに ${x}
を使うか (再び x
は制御文字)、よりよいのは $^A
(^
はキャレット (CIRCUMFLEX ACCENT)、A
は "OPERATOR DIFFERENCES" in perlebcdic の末尾に一覧がある任意の文字) を 使ってください。
レキシカル変数宣言のリスト (my($x, $y)
) は単一の op に最適化されたので、 以前より高速になりました。
新しい C プリプロセッサ定義 NO_TAINT_SUPPORT
が追加されました; これが 設定されると、Perl の汚染対応が完全に無効になります。 -T や -t のコマンドラインフラグを使うと致命的エラーとなります。 両方のコアのテストと同様に、多くの CPAN 配布のテストもこの変更で 失敗することに注意してください。 一方、分岐が減ることにより少し性能が改善します。
自分自身が何をしているかを正確に理解していない限りこれを 有効にしないでください。
定数引数の pack
はほとんどの場合定数畳み込みされるようになりました [perl #113470]。
Unicode 特性に対してマッチングする正規表現が高速化されました。 最大の改善は Unicode「拡張書記素クラスタ」である \X
です。 これに関する改善はおよそ 35% - 40% です。 256 以上の符号位置を含む大かっこ文字クラス、例えば 0-9\x{100}]
も 高速化されました。
対応しているプラットフォームでは、いくつかの以前のマクロは静的インライン 関数として実装されるようになりました。 これは非 GCC プラットフォームで少し高速化するはずです。
真偽値コンテキストでのハッシュの最適化は scalar(%hash)
, %hash ? ... : ...
, sub { %hash || ... }
に影響を与えるように 拡張されました。
ファイルテスト演算子はスタックを少しだけより効率的な方法で扱うように なりました。
数値コンテキストで使われるグロブは、ほとんどの場合、文字列化を経由して 数値化されるのでなく、直接数値化されるようになりました。
x
繰り返し演算子は、スカラコンテキストで定数オペランドで呼び出され、 左オペランドにかっこがなければ、コンパイル時に単一の定数に 畳み込まれるようになりました。
Config::Perl::V バージョン 0.16 は二重管理モジュールとして追加されました。 これは、perl
バイナリのみが知っていて Config 経由では利用できない 情報を含む、perl -V
出力の構造化されたデータを提供します。
更新の完全な一覧は、以下を実行してください:
$ corelist --diff 5.16.0 5.18.0
5.16.0
の部分は好みのバージョンに置き換えることもできます。
Archive::Extract はバージョン 0.68 に更新されました。
Busybox の unzip を使う Linux でのエッジケースを回避します。
Archive::Tar はバージョン 1.90 に更新されました。
ptar はダッシュなしのオプションと共に -T オプションに 対応するようになりました [rt.cpan.org #75473], [rt.cpan.org #75475]。
UTF-8 とマークされたファイル名を自動的にエンコードするようになりました [rt.cpan.org #75474]。
IO::Zlib ハンドルに対して tell
を使わなくなりました [rt.cpan.org #64339]。
シンボリックリンクに対して chown
しようとしなくなりました。
autodie はバージョン 2.13 に更新されました。
autodie
は 'open' プラグマをうまく扱うようになりました。
B はバージョン 1.42 に更新されました。
COP の stashoff
メソッドが追加されました。 これは perl 5.16 のスレッドビルドで追加された内部フィールドへのアクセスを 提供します [perl #113034]。
B::COP::stashpv
は UTF-8 パッケージ名と埋め込みの NUL に 対応するようになりました。
全ての CVf_*
と GVf_*
と、さらに SV 関係のフラグの値は、 B::
名前空間の定数として提供され、エクスポート可能になりました。 デフォルトのエクスポートリストは変更されません。
これによりモジュールが新しい pad API で動作するようになります。
B::Concise はバージョン 0.95 に更新されました。
-nobanner
オプションが修正され、format
がダンプできるようになりました。 ダンプするサブルーチン名を渡したとき、それがフォーマットの名前かどうかも チェックします。 サブルーチンとフォーマットが同じ名前を共有している場合、両方とも ダンプされます。
これは新しい OpMAYBE_TRUEBOOL
および OPpTRUEBOOL
フラグへの 対応を追加します。
B::Debug はバージョン 1.18 に更新されました。
これは、Perl 5.17.4 で追加された B::PADLIST
への対応を(実験的に) 追加します。
B::Deparse はバージョン 1.20 に更新されました。
perl -w
で実行されたときの警告を避けるようになりました。
ループ制御を正しく逆パースするようになり、format
行に複数の文が あっても正しく逆パースできるようなりました。
このリリースはフォーマットの末尾のセミコロンを抑制します。
このリリースはレキシカルサブルーチンのためのスタブ逆パースが追加します。
引数なしの sort
を逆パースしてももはや die しなくなりました。 system $prog @args
と exec $prog @args
のカンマを正しく 省略できるようになりました。
bignum, bigint, bigrat はバージョン 0.33 に更新されました。
hex
と oct
のオーバーライドが書き直され、いくつかの問題が取り除かれ、 一つの互換性のない変更が行われました:
以前は、use bigint
または use bigrat
が後でコンパイルされると もう片方よりも優先順位が上になるので、スコープ内にあるときに hex
と oct
がもう一つのプラグマを考慮しなくなっていました。
これら三つのプラグマのいずれかを使うと、hex
と oct
はプログラム中の どこにあっても引数をリストコンテキストで評価し、引数なしで予備されたときに $_ を推論するのを妨げていました。
これらの三つのプラグマのいずれかを使うと、プログラム中のどこにあっても oct("1234")
(0 以外で始まる任意の数字について) が 1234 を返していました。 プラグマのスコープ内かどうかに関わらず、"1234" は 8 進数から 10 進数に 変換されるようになりました。
hex
と oct
の使用を便利にするためのグローバルなオーバーライドは、 その場で以前新しく行われていた既存のオーバーライドを考慮して、 use bignum
のスコープの外側ではそれらに フォールバックするようになりました。
bigint や bigrat のための use bignum "hex"
, use bignum "oct"
あるいは 同様の起動によって、グローバルなオーバーライドを提供するのではなく、 hex
や oct
関数をエクスポートするようになりました。
Carp はバージョン 1.29 に更新されました。
Carp はもはや、caller
が既に削除されたパッケージで undef を返したときに 混乱しなくなりました。
longmess()
と shortmess()
関数は文書化されました。
CGI はバージョン 3.63 に更新されました。
認識できない HTML エスケープシーケンスはよりよく扱われるようになり、 問題のある末尾の改行は、もはや startform()
や start_form()
によって <form> タグの後に挿入されなくなり、また一部のバージョンの perl で 現れていた偽の "Insecure Dependency" 警告は回避されるようになりました。
Class::Struct はバージョン 0.64 に更新されました。
コンストラクタはオーバーライドされるアクセサメソッドに従うようになりました [perl #29230]。
Compress::Raw::Bzip2 はバージョン 2.060 に更新されました。
Perl の "magic" API の誤用は修正されました。
Compress::Raw::Zlib はバージョン 2.060 に更新されました。
同梱されている zlib はバージョン 1.2.7 に更新されました。
Irix, Solaris, Win32 でのビルド失敗、および C++ としてビルドしたときの 失敗が修正されました [rt.cpan.org #69985], [rt.cpan.org #77030], [rt.cpan.org #75222]。
Perl の "magic" API の誤用は修正されました。
compress()
, uncompress()
, memGzip()
, memGunzip()
は、引数の バリデーションをより効率的に行うことで高速化されました。
CPAN::Meta::Requirements はバージョン 2.122 に更新されました。
from_string_hash
に対する undef の扱いが (警告付きの) 0 になりました。
requirements_for_module
メソッドが追加されました。
CPANPLUS はバージョン 0.9135 に更新されました。
PATH に blib/script が追加されました。
シェルの起動の間の履歴が保存されるようになりました。
複数の makemakerargs
および makeflags
引数をより良く 扱うようになりました。
これは SQLite ソースエンジンの問題を解決します。
Data::Dumper はバージョン 2.145 に更新されました。
スカラに見えるハッシュを必要な場合にのみ構築するように最適化され、 それによってシリアル化が大幅に高速化しました。
文、分岐、条件、サブルーチンカバレッジの向上のために追加のテストが 追加されました。 カバレッジ解析に基づいて、Dumper.pm の内部の一部が リファクタリングされました。 ほとんど全てのメソッドは文書化されました。
DB_File はバージョン 1.827 に更新されました。
メイン Perl モジュールはもはや "@_"
構文を使わなくなりました。
Devel::Peek はバージョン 1.11 に更新されました。
これは C++ コンパイラでのコンパイルの問題を修正し、モジュールが新しい pad API で動作するようにします。
Digest::MD5 はバージョン 2.52 に更新されました。
Digest::Perl::MD5
OO フォールバッグが修正されました [rt.cpan.org #66634]。
Digest::SHA はバージョン 5.84 に更新されました。
これは、場合によっては脆弱性を引き起こしていた二重解放バグを修正します。
DynaLoader はバージョン 1.18 に更新されました。
これは VMS 実装のための XS の小さなコード変更によるものです。
これは OUTPUT
節なしで CODE
節を使うことに関する警告を修正します。
Encode はバージョン 2.49 に更新されました。
Mac 別名 x-mac-ce が追加され、Encode::Unicode, Encode::UTF7, Encode::GSM0338 の様々なバグが修正されました。
Env はバージョン 1.04 に更新されました。
SPLICE 実装はもはやリストコンテキストで間違ってる振る舞いをしなくなりました。
ExtUtils::CBuilder はバージョン 0.280210 に更新されました。
Manifest ファイルは、使おうとする VC++ のバージョンを正しく 組み込むようになりました。 [perl #111782, #111798]。
Windows でも、その他の OS と同様、エクスポートするシンボルの一覧を link()
に渡せるようになりました [perl #115100]。
ExtUtils::ParseXS はバージョン 3.18 に更新されました。
生成された C コードは、自動的に PL_amagic_generation
を インクリメントする Perl バージョン (あるいはこの変数がもはや存在しない 現在の Perl) で不必要にインクリメントしなくなりました。
これは初期化された XSUB 非パラメータに関する偽の警告を回避します [perl #112776]。
File::Copy はバージョン 2.26 に更新されました。
copy()
はもはや同じディレクトリにコピーするときにファイルをゼロに することはなく、自分自身にコピーしようとした場合に(長い間そうすると 文書化されていたように)失敗するようになりました。
File::DosGlob はバージョン 1.10 に更新されました。
それぞれの呼び出し元に関して保持していたファイル名の内部キャッシュは 呼び出し元が解放されたときに解放されるようになりました。 これは、use File::DosGlob 'glob'; eval 'scalar <*>'
がもはや メモリリークしないということです。
File::Fetch はバージョン 0.38 に更新されました。
ファイル要素を持たない URL のための 'file_default' オプションが 追加されました。
利用可能なら File::HomeDir
を使い、自動検出を上書きするための PERL5_CPANPLUS_HOME
を提供するようになりました。
fetchdir
が設定されると常に CHECKSUMS を 再フェッチするようになりました。
File::Find はバージョン 1.23 に更新されました。
これは VMS での unix 風パスの扱いの非一貫性を修正します。
個々のファイルが検索したディレクトリの一覧に現れるようになりました [perl #59750]。
File::Glob はバージョン 1.20 に更新されました。
File::Glob は File::DosGlob と正確に同じ修正が行われました。 (VMS 以外では) Perl 自身の glob
演算子自身が使っているので、これは eval 'scalar <*>'
がもはやリークしないということです。
長い一覧を返すパターンのスペース区切りの一覧はもはやメモリ破壊やクラッシュを 彦越さなくなりました。 このバグは Perl 5.16.0 で導入されました。 [perl #114984]
File::Spec::Unix はバージョン 3.40 に更新されました。
abs2rel
は、二つの相対パスが与えられたりルートディレクトリが二回 与えられたときに間違った結果を生成することがありました [perl #111510]。
File::stat はバージョン 1.07 に更新されました。
File::stat
は filetest プラグマを無視し、組み合わせて使われると 警告します。 しかしこれは -r
は警告していませんでした。 これは修正されました [perl #111640]。
-p
が動作するようになり、パイプに対して偽を返さなくなりました [perl #111638]。
以前は File::stat
によってオーバーロードされた -x
と -X
演算子は、 root として実行されているときにディレクトリと実行ファイルに関して 正しい結果になっていませんでした。 root に対する実行許可はその他のユーザーと同様、root によって所有されていない ファイルについてはグループ所有者テスト など を行っていました。 これらは正しい Unix の振る舞いに従うようになりました - ディレクトリに対しては 常に真、ファイルに関しては三つの実行許可ビットのいずれかが設定されていれば root がファイルを実行できると報告します。 Perl の組み込みの -x
と -X
演算子は常に正しいです。
File::Temp はバージョン 0.2 に更新されました。
ディレクトリ削除に関する様々なバグが修正されました。 最初の unlink が失敗した場合、一時ファイルの削除は延期されるようになり、 これにより NFS での問題が修正されました。
GDBM_File はバージョン 1.15 に更新されました。
TIEHASH
に対する文書化されていなかったオプションの第 5 引数は 削除されました。 これは(ファイルシステムの問題のような)致命的エラーの場合に gdbm*
関数によって使われるコールバックの制御を提供することを 意図していましたが、動作しておらず (そして動作させることもできず)、 CPAN のコードでは使おうとすらされていませんでした。 コールバックは常に以前のデフォルトである croak
になりました。 C
の croak
関数の呼び出され方に関する一部のプラットフォームでの問題も 解決しました。
Hash::Util はバージョン 0.15 に更新されました。
hash_unlocked
と hashref_unlocked
は、常に偽を返すのではなく、 ハッシュがアンロックされた場合に真を返すようになりました [perl #112126]。
hash_unlocked
, hashref_unlocked
, lock_hash_recurse
, unlock_hash_recurse
はエクスポート可能になりました [perl #112126]。
二つの新しい関数 hash_locked
と hashref_locked
が追加されました。 おかしなことに、これら二つの関数は存在していないのに既に エクスポートされていました [perl #112126]。
HTTP::Tiny はバージョン 0.025 に更新されました。
SSL 検証機能が追加されました [github #6], [github #9]。
レスポンスハッシュリファレンスに最終的な URL が含まれるようになりました。
local_address
オプションが追加されました。
これは SSL 対応を改良します。
IO はバージョン 1.28 に更新されました。
sync()
は読み込み専用ファイルハンドルに対して呼び出せるようになりました [perl #64772]。
IO::Socket はソケット情報をよりしっかりとキャッシュやさもなければ フェッチしようとするようになりました。
IPC::Cmd はバージョン 0.80 に更新されました。
run_forked
で exit
ではなく Use POSIX::_exit
を使うようになりました [rt.cpan.org #76901]。
IPC::Open3 はバージョン 1.13 に更新されました。
open3()
関数はファイル記述子を閉じるのにもはや POSIX::close()
を 使わなくなりました; なぜなら、ファイル記述子が PerlIO ストリームによって 共有されている場合、PerlIO によって行われるファイル記述子の参照カウントを 壊し、そのような PerlIO ストリームが後で閉じられたときに 2 回ファイル 記述子を閉じようとしていました。
Locale::Codes はバージョン 3.25 に更新されました。
いくつかの新しいコードを含んでいます。
Memoize はバージョン 1.03 に更新されました。
MERGE
キャッシュオプションが修正されました。
Module::Build はバージョン 0.4003 に更新されました。
$VERSION
のないモジュールが 'provides' メタデータの中でバージョン '0' を 出力して、PAUSE に拒否されるバグを修正しましたs。
モジュール名に数詞が使えるようにするために PodParser のバグを修正しました。
引数を 2 回渡すと配列になり、インストールパスが ARRAY(0xdeadbeef)/lib/Foo.pm のようになる問題が修正されました。
小さなバグ修正により、POD "abstract" 行の先頭の "Name" の周りに マークアップが使えるようになり、一部の文書の改良が行われました。
Module::CoreList はバージョン 2.9 に更新されました。
バージョン情報は差分として保管されるようになり、CoreList.pm ファイルの サイズが大幅に削減されました。
これにより古いバージョンの perl との互換性が復活し、様々なモジュールの コアリストデータが整理されました。
Module::Load::Conditional はバージョン 0.54 に更新されました。
スペースを含むパスにインストールされた perl での requires
の使用が 修正されました。
新しい Module::Metadata の使用を含む様々な拡張が行われました。
Module::Metadata はバージョン 1.000011 に更新されました。
典型的なモジュールファイルに対する Module::Metadata オブジェクトの作成は 約 40% 高速化し、$VERSION
に関する偽の警告が抑制されました。
Module::Pluggable はバージョン 4.7 に更新されました。
その他の変更と共に、トリガはイベントに対して可能になり、振る舞いを 変更するための強力な手段となりました。
Net::Ping はバージョン 2.41 に更新されました。
これは Windows でのいくつかのテスト失敗を修正します。
Opcode はバージョン 1.25 に更新されました。
boolkeys オペコードの削除と clonecv, introcv, padcv オペコードの追加を 反映しました。
overload はバージョン 1.22 に更新されました。
no overload
は use overload
と同様、不正な引数に対して 警告するようになりました。
PerlIO::encoding はバージョン 0.16 に更新されました。
これは ":encoding(...)" I/O 層を実装するモジュールです。 これはエンコーディングバックエンドがバッファを再配置したり型グロブや 共有ハッシュキースカラに使っても、もはやメモリを壊したり クラッシュしたりしなくなりました。
PerlIO::scalar はバージョン 0.16 に更新されました。
提供されるバッファスカラは符号位置 0xFF 以下のみを含むようになりました。 [perl #109828]
Perl::OSType はバージョン 1.003 に更新されました。
これは VOS オペレーティングシステムを検出するバグを修正します。
Pod::Html はバージョン 1.18 に更新されました。
--libpods
オプションが回復しました。 これは廃止予定で、もはや対応しないという警告を出す以外のことは何もしません。
UTF-8 文字集合であると主張する、pod2html で生成された HTML ファイルは、 実際に UTF-8 を使ってファイルを書き出します [perl #111446]。
Pod::Simple はバージョン 3.28 に更新されました。
多くの改良が行われました; ほとんどは Pod::Simple::XHTML に対するもので、 互換性の変更も行われました: codes_in_verbatim
オプションはデフォルトで 無効になりました。 完全な詳細については cpan/Pod-Simple/ChangeLog を参照してください。
re はバージョン 0.2 に更新されました。
/[s]/
や /[s]/i
のような、単一文字の 大かっこクラスは、 大かっこがないかのように最適化されるようになりました; つまり /s/
や /s/i
。
以下の "Internal Changes" 節の op_comp
に関する注意を参照してください。
Safe はバージョン 2.35 に更新されました。
Devel::Cover
との相互作用が修正されました。
no strict
でコードを eval しなくなりました。
Scalar::Util はバージョン 1.27 に更新されました。
sum
のオーバーロードの問題が修正されました。
first
と reduce
はまずコールバックをチェックするようになりました (従って &first(1)
とはできません)。
マジカル値に対する tainted
が修正されました [rt.cpan.org #55763]。
以前マジカルだった値に対する sum
が修正されました [rt.cpan.org #61118]。
固定バッファの末尾を超えた読み込みが修正されました [rt.cpan.org #72700]。
Search::Dict はバージョン 1.07 に更新されました。
ファイルハンドルへの stat
はもはや要求しなくなりました。
文字の畳み込みに fc
を使うようになりました。
Socket はバージョン 2.009 に更新されました。
IP マルチキャストソースグループメンバーシップに要求される定数と関数が 追加されました。
unpack_sockaddr_in()
と unpack_sockaddr_in6()
は、スカラ コンテキストでは単に IP アドレスを返すようになり、inet_ntop()
は渡された 不正な長さのスカラから保護するようになりました。
この修正は未初期化メモリの読み込みを修正します。
Storable はバージョン 2.41 に更新されました。
STORABLE_freeze
の中で $_[0]
を修正してももはや クラッシュしなくなりました [perl #112358]。
STORABLE_attach
を実装しているオブジェクトは、解凍される構造で複数回 参照されるときに一度だけ解凍されるようになりました [perl #111918]。
制限ハッシュは常に正しく解凍されていませんでした [perl #73972]。
Storable は、STORABLE_freeze()
メソッドがある bless された REF オブジェクトを凍結させるときに croak するようになりました [perl #113880]。
v文字列を正しく凍結および解凍できるようになりました。 これにより保管フォーマットに少し互換性のない変更を引き起こしたので、 フォーマットバージョンは 2.9 に増加しました。
これには様々なバグ修正を含んでいます; 古いバージョンの Perl やv文字列の扱いの 互換性の修正を含みます。
Sys::Syslog はバージョン 0.32 に更新されました。
getservbyname()
, setlogsock()
および syslog()
のログレベルに 関するものに加えて、Windows, Haiku-OS, GNU/kFreeBSD に関連する いくつかのバグ修正を含んでいます。 完全な詳細については cpan/Sys-Syslog/Changes を参照してください。
Term::ANSIColor はバージョン 4.02 に更新されました。
斜体に対応しました。
エラー処理が向上しました。
Term::ReadLine はバージョン 1.10 に更新されました。 これは、Windows でたまたま現在のドライブに \dev\tty ファイルがあるときの cpan や cpanp シェルの使用を修正します。
Test::Harness はバージョン 3.26 に更新されました。
Win32 でのグロブ意味論が修正されました [rt.cpan.org #49732]。
perl を呼び出すときに Win32::GetShortPathName
を使わなくなりました [rt.cpan.org #47890]。
シェバンを読むときに -T を無視するようになりました [rt.cpan.org #64404]。
テストの待ち状態が分からない場合をより優雅に扱うようになりました。
テストサマリの 'ok' 行を上書きできるようになったのでprove 互換の出力を 作るためのプラグインに変更出来るようになりました。
全体書き込み可能ファイルを実行しなくなりました。
Text::Tabs と Text::Wrap は 2012.0818 に更新されました。 Unicode 結合文字の扱いが両方に追加されました。
threads::shared はバージョン 1.31 に更新されました。
クローンできない構造体をクローンしようとしたときに無条件に die するのではなく、警告したり無視したりするオプションが追加されました。
Scalar::Util::dualvar によって 作成された二重値対応が追加されました。
Tie::StdHandle はバージョン 4.3 に更新されました。
READ
は read
へのオフセット引数を考慮するようになりました [perl #112826]。
Time::Local はバージョン 1.2300 に更新されました。
59 より大きく 60 より小さい秒はもはや timegm()
と timelocal()
で croak を引き起こさなくなりました。
Unicode::UCD はバージョン 0.53 に更新されました。
これは、全ての折り畳み文字を返す関数 all_casefolds() を追加します。
Win32 はバージョン 0.47 に更新されました。
現在のコードページを取得および設定するための新しい API が追加されました。
Version::Requirements はコア配布から削除されました。 これは異なった名前で利用可能です: CPAN::Meta::Requirements。
perlcheat は再構成され、いくつかの新しい内容が追加されました。
重複したキーを持つハッシュ初期化リストの振る舞いが明示的に文書化されました。
シンボリックリファレンスが "strict refs" で妨げられるという説明は、 読者がシンボリックリンクが何かということを知っているということを 仮定しなくなりました。
perlfaq は CPAN のバージョン 5.0150040 と同期されました。
pipe
の返り値が文書化されました。
our
の文書を明確化しました。
ループ制御動詞 (dump
, goto
, next
, last
, redo
) は常に 代入演算子と同じ優先順位を持っていますが、今まで文書化されていませんでした。
以下の追加や変更が、警告や致命的エラーメッセージ含む診断出力に行われました。 完全な診断メッセージの一覧については、perldiag を参照してください。
Unterminated delimiter for here document
このメッセージは、ヒヤドキュメントラベルの先頭に引用符があるけれども 末尾の引用符がない場合に起きるようになりました。
これは、ラベル自身が見つからないという偽で誤解させるエラーメッセージを 置き換えます [perl #114104]。
panic: child pseudo-process was never scheduled
このエラーは、Windows の ithreads 実装での子疑似プロセスが定められた時間 以内に計画されず、そのため適切に初期化できなかったときに投げられます [perl #88840]。
Group name must start with a non-digit word character in regex; marked by <-- HERE in m/%s/
このエラーは、不正である (?&0)
のために追加されました。 以前は不可解なエラーメッセージを生成していました [perl #101666]。
Can't use an undefined value as a subroutine reference
サブルーチンとして未定義値を呼び出すとこのエラーメッセージが生成されます。 以前はそうでしたが、誤って無効になっていました; 非マジカル変数に関しては Perl 5.004 から、(例えば tie されたような)マジカルな変数に関しては Perl v5.14 からです。 これは復元されました。 それまでは、undef は空文字列として扱われていました [perl #113576]。
Experimental "%s" subs not enabled
レキシカルなサブルーチンを使うには、まず有効にしなければなりません:
no warnings 'experimental::lexical_subs';
use feature 'lexical_subs';
my sub foo { ... }
'Strings with code points over 0xFF may not be mapped into in-memory file handles'
'Trailing white-space in a charnames alias definition is deprecated'
'A sequence of multiple spaces in a charnames alias definition is deprecated'
Subroutine "&%s" is not available
(W closure) コンパイルの間、内側の名前付きサブルーチンや eval は 現在利用できない外側のレキシカルサブルーチンを捕捉しようとしています。 これは二つの理由の一つで起こりえます。 1 番目として、レキシカルサブルーチンはまだ作成されていない外側の 無名サブルーチンで宣言されるかもしれません。 (名前付きサブルーチンはコンパイル時に作成され、一方無名サブルーチンは 実行時に作成されることを忘れないでください。) 例えば、
sub { my sub a {...} sub f { \&a } }
f が作成される時点で、現在の "a" サブルーチンを捕捉することはできません; 無名サブルーチンはまだ作成されていないからです。 反対に、以下のものは警告が出ません; 無名サブルーチンは既に作成されていて 有効だからです:
sub { my sub a {...} eval 'sub f { \&a }' }->();
2 番目の状況は、eval がスコープから外れた変数にアクセスすることによって 引き起こされます; 例えば、
sub f {
my sub a {...}
sub { eval '\&a' }
}
f()->();
ここで、eval 内の '\&a' がコンパイルされるとき、f() はまだ 実行されていないので、&a は捕捉するために利用できません。
"%s" subroutine &%s masks earlier declaration in same %s
(W misc) "my" または "state" サブルーチンが同じスコープや文で再定義され、 事実上以前の実体への全てのアクセスが削除されました。 これはほとんど常にタイプミスです。 以前のサブルーチンはスコープの終了したりや全てのクロージャリファレンスが 破壊されるまでまだ存在したままであることに注意してください。
The %s feature is experimental
(S experimental) この警告は、use feature
で実験的機能を有効にしたときに 出力されます。 この機能を使いたいなら単に警告を抑制してください; しかしそうすると いうことは、将来の Perl バージョンで変更されたり削除されたりする実験的機能を 使うリスクを取るということです:
no warnings "experimental::lexical_subs";
use feature "lexical_subs";
(W overflow) sleep
を信頼性を持って扱えるよりも大きな値で呼び出したので、 sleep
はおそらく指定されたよりも短い時間だけ sleep します。
%ENV
経由で環境変数にワイド文字を入れようとするとこの警告が 出るようになりました。
"Invalid negative number (%s) in chr"
chr()
は、負数を渡すと警告するようになりました [perl #83048]。
srand()
は、UV
に収まらない値を渡すと (値はオーバーフローするのではなく 切り詰められるので) きに警告するようになりました [perl #40605]。
"-i used with no filenames on the command line, reading from STDIN"
入力ファイルがコマンドラインから提供されないときに -i
フラグ付きで perl を 実行すると、警告するようになりました [perl #113410]。
$*
および $#
の使用には対応していないという警告は、参照しているところ 全てで起こるようになりました。 以前は、同じ型グロブを使っている他の変数が先に現れると (例えば $*
の前に @*
) 生成に失敗していて、また 2 回目以降の使用では 生成されていませんでした。 (毎回生成することなく生成警告の失敗を修正するのは困難で、毎回警告するのは $[
が生成していた警告と一貫性があります。used to generate.)
\b{
と \B{
のための警告が追加されました。 これはそのカテゴリでオフにされるべき廃止予定警告です。 これらを避けるために正規表現警告をオフにする必要があるべきではありません。
Constant(%s): Call to &{$^H{%s}} did not return a defined value
undef
を返す定数オーバーロードはこのエラーメッセージを出力します。 数値定数に関しては、"Constant(undef)" となっていました。 "undef" は数値自身に置き換えられました。
モジュールが読み込めなかったときに生成されるエラーには、モジュールを インストールする必要があるかも知れないことを示すヒントが 含まれるようになりました: "Can't locate hopping.pm in @INC (you may need to install the hopping module) (@INC contains: ...)"
vector argument not supported with alpha versions
この警告は no warnings
でも抑制できませんでした。 これは抑制できるようになり、"internal" カテゴリから "printf" カテゴリに 移動しました。
Can't do {n,m} with n > m in regex; marked by <-- HERE in m/%s/
この致命的エラーは以下の警告になりました:
Quantifier {n,m} with n > m can't match in regex
(W regexp) 最小値は最大値以下であるべきです。 本当に正規表現で何かに 0 回マッチングしたいなら、単に {0} としてください。
奇妙な状況で起きる "Runaway prototype" 警告は削除されました; これは 助けにならず一貫していないからです。
"Not a format reference" エラーは削除されました; これが引き起こされるかも 知れない唯一の状況はバグだからです。
"Unable to create sub named %s" エラーも同じ理由で削除されました。
'Can't use "my %s" in sort comparison' エラーは、 '"my %s" used in sort comparison' (state 変数の場合は 'my' の代わりに 'state') 警告に格下げされました。 さらに、レキシカルな $a や $b が誤用されているかどうかを推測する ヒューリスティックは、偽陽性の生成が減少するように改良されました。 レキシカルな $a や $b は、ソートブロックの外側ならもはや 禁止されなくなりました。 また、ソートブロックの内側の名前付き単項またはリスト演算子を使うと $a や $b が無視されるということはもはやなくなりました [perl #86136]。
h2xs はもはや空定義で不正なコードを生成しなくなりました。 [perl #20636]
Configure に useversionedarchname
オプションが追加されました
設定されると、'archname' に 'api_versionstring' が含まれます。 例えば x86_64-linux-5.13.6-thread-multi。 これはデフォルトでは設定されていません。
この機能は、INSTALL_BASE
が perl のバージョンによって違いがない ライブラリ構造を作ることを観測した Tim Bunce によって要望されました。 代わりに、アーキテクチャ固有のファイルを "$install_base/lib/perl5/$archname" に置きます。 これにより、複数のバージョンの perl で共通の INSTALL_BASE
ライブラリパスを 使うのを難しくしていました。
-Duseversionedarchname
を設定することで、$archname はアーキテクチャ および API バージョンで識別され、INSTALL_BASE
を混ぜて 使えるようになります。
PERL_NO_INLINE_FUNCTIONS
オプションを追加しました
PERL_NO_INLINE_FUNCTIONS
が定義されると、"inline.h" を インクルードしません。
これにより、テストコードが、(まだ存在しないかも知れない) perl ライブラリへの リンク依存を作ることなく perl ヘッダをインクルードできるようになります。
設定すると、Configure は外部の MAILDOMAIN
環境変数を調べます。
installman
は静粛オプションを無視しなくなりました。
META.yml
と META.json
の両方のファイルは配布に含まれるように なりました。
C++ でコンパイルするとき、Configure は正しく isblank()
を 検出するようになりました。
Configure のページャ検出は、ユーザーがデフォルト値を受け付けるときに プログラム名の後にオプションを指定した場合 (例えば /usr/bin/less -R) に 対応するように改良されました。 これは ANSI エスケープを扱うときに perldoc を助けます [perl #72156]。
テストスイートはとても大きなメモリを必要とするテストのための節を 持つようになりました。 これらのテストはデフォルトでは実行されません; PERL_TEST_MEMORY
環境変数に 安全に使えるメモリ量をギビバイト単位で指定することで有効になります。
BeOS は Be Inc によって開発されたパソコンのためのオペレーティングシステムで、 当初は BeBox ハードウェアのためのものです。 Haiku OS は BeOS のオープンソース代替品/続編で、この perl 版は最新で活発に 保守されています。
UTS グローバルに関する対応コードは削除されました。 UTS は Amdahl によって作成されたメインフレーム版の System V で、その後 UTS Global によって販売されました。 この移植版は Perl v5.8.0 以前から触れられておらず、UTS Global は もうありません。
VM/ESA 対応は削除されました。 この移植版は IBM が 2002 年 3 月に対応を終了した 2.3.0 で テストされていました。 2.4.0 は 2003 年 6 月に対応を終了し、Z/VM に取って代わられました。 Z/VM の現在のバージョンは V6.2.0 で、2015/04/30 に対応を終了することが 予定されています。
MPE/IX 対応は削除されました。
EPOC に関連する対応コードは削除されました。 EPOC は Psion によって開発されたモバイルデバイス向けのオペレーティング システムファミリーです。 これは Symbian の祖先です。 この移植版が最後に更新されたのは 2002 年 4 月です。
Rhapsody 対応は削除されました。
Configure は xlC を使うときに AIX の CC フラグに常に -qlanglvl=extc99
を 追加するようになりました。 これにより C99 を仮定している多くの XS ベースのモジュールをコンパイルするのが より容易になります [perl #113778]。
Perl v5.15.7 から clang++ でコンパイルするのを妨げるコンパイラのバグを 回避するようになりました [perl #112786]。
Perl コアを C++ としてコンパイルするとき(これは半対応状態です)、 mathom 関数は extern "C"
でコンパイルされるようになれるようになりました; 適切なバイナリ互換性を確実にするためです。 (しかし、バイナリ互換性は、これが問題になるような状況では一般的には 保証されません。)
-Dusemorebits を使ったビルドを修正するために、8 バイト境界のアライメントの ハードコーディングを止めました。
Perl は Haiku R1 Alpha 4 そのままで動作するようになったはずです。
libc_r
は最近のバージョンの MidnightBSD から取り除かれ、より古い バージョンは pthread
でよりよく動作します。 0.4-CURRENT でスレッドを有効にしたときのビルドエラーを修正するために、 スレッドは pthread
を使って有効化されるようになりました。
Configure で、Solaris で対応していないフラグ付きの sed コマンドを 実行しないようになりました。
可能な場所では、起動時に CRTL 機能 DECC$EFS_CASE_PRESERVE
と DECC$ARGV_PARSE_STYLE
を有効にすることで、ファイル名とコマンドライン引数の 大文字小文字を保存するようになりました。 後者は Perl が実行されているプロセスで拡張パースが有効の場合にのみ効果が あります。
Extended Filename Syntax (EFS) のための文字集合は VMS ではデフォルトで 有効になりました。 特に、これはディレクトリ名のドット、ファイル名の複数のドット、ファイル名の 中のスペースをよりよい扱いを提供します。 古い振る舞いを適用するには、論理名 DECC$EFS_CHARSET
を DISABLE
に 設定してください。
-Dusemymalloc=y
が設定されたビルドのリンクが修正されました。
HP C++ コンパイラでの Perl ビルドの実験的対応は -Dusecxx
付きで 設定することで利用可能です。
配布の最上位ディレクトリの全ての C ヘッダファイルは VMS に インストールされるようになり、他のプラットフォームの長年の慣例との一貫性を 提供します。 以前は一部分のみがインストールされていたので、書けていたインクルード ファイルに依存していたエクステンションに関しては非コアエクステンションの ビルドを壊していました。
system
、逆クォート、パイプの open
で起動されるコマンドのための コマンド動詞からクォートが削除されました(引数はそのままです)。 以前は、動詞のクォートは DCL に渡され、コマンドの認識に 失敗することになっていました。 また、動詞が実際には ODS-5 ボリュームのイメージやコマンド手続きへのパスの 場合、クォートすることでスペースを含むパスが使えるようになりました。
a2p ビルドは OpenVMS での C++ コンパイラのために修正されました。
win32/Makefile でCCTYPE=MSVC110 (または無料の Express Express edition for Windows Desktop を使っているなら MSVC110FREE) を指定することで Microsoft の Visual C++ 2012 コンパイラを使ってビルドできるようになりました。
USE_SOCKETS_AS_HANDLES
なしでビルドするオプションは削除されました。
Win32 のスレッド付きデバッグビルドおよび、可能性としては他の プラットフォームで、(メインスレッドを含む) スレッドの掃除中に クラッシュすることがある問題が修正されました [perl #114496]。
要求したよりも長い間 sleep したり、ハングする可能性も あるような、稀な競合条件が修正されました [perl #33096]。
Win32 での link
は、Win32 API エラーコードを基にしたより適切な値を $!
に 設定しようとするようになりました。 [perl #112272]
Perl は、例えば新しいサブプロセスを起動するとき、環境に非 ASCII 文字が 入っているときに、もはや環境ブロックを壊さなくなりました。 しかし、環境に現在の ANSI コードページの外側の文字を含む場合の既知の問題は まだ残っています (例えば、%ENV
内の Unicode については http://perl5.git.perl.org/perl.git/blob/HEAD:/Porting/todo.pod を 参照してください)。 [perl #113536]
一部の Windows での perl のビルドは、 (perlglob
プログラムを使う) miniperl の glob
演算子が PATH 環境変数を 削除するという問題によって失敗していました [perl #113798]。
新しい makefile オプションである USE_64_BIT_INT
が Windows の makefile に追加されました。 32-ビット perl をビルドするときに 64-ビット整数を使いたいなら、これを "define" に設定します。
マシンコードサイズの削減は、XS モジュールの DLL に対しては既に Perl v5.17.2 で行われていましたが、perl DLL 自身に拡張されました。
VC++ 6.0 でのビルドは不注意により Perl v5.17.2 で壊れていましたが、 再び修正されました。
WinCE でのビルドは再び可能になりましたが、クリーンなビルドを完全に 復元するにはさらなる作業が必要です。
誤解される名前である av_len()
の同義語が作成されました: av_top_index()
と av_tindex
。 これら三つ全ては、含んでいる要素の数ではなく、配列の最大のインデックスの値を 返します。
SvUPGRADE() もはや式ではありません。 元々このマクロ (および基礎となる関数 sv_upgrade()) は真偽値を返すと 文書化されていましたが、実際にはエラー時には常に croak し、偽の値を 返すことはありませんでした。 2005 年に、返り値は void であるというように文書が更新されましたが、 SvUPGRADE() は後方互換性のために常に 1 を返すままで残されました。 これは削除され、SvUPGRADE() は値を返さない文になりました。
従ってこれは文法エラーになりました:
if (!SvUPGRADE(sv)) { croak(...); }
このようなコードがあるなら、単に以下のもので置き換えるか
SvUPGRADE(sv);
あるいは古い perl でのコンパイラ警告を避けるために、以下のようにしてください
(void)SvUPGRADE(sv);
Perl は、任意の SvPOK スカラをコピーオンライトスカラに昇格できる新しい コピーオンライト機構を持ちます。 文字列バッファの参照カウントは文字列バッファ自身に保管されます。 この機能は デフォルトでは有効になりません。
これは -Accflags=-DPERL_NEW_COPY_ON_WRITE 付きで Configure を実行した perl ビルドで有効にでき、私たちは XS 作者がこのように有効になった perl でコードを試して、フィードバックを提供するように勧めます。 残念ながら、COW に対応するように XS コードを更新するためのよいガイドは まだありません。 そのような文書が利用可能になるまで、perl5-porters メーリングリストに 相談してください。
これは、コピーオンライトスカラが以前は決して遭遇しなかったコードパスを 通ることを許すので、いくつかの XS モジュールを壊します。
コピーオンライトはもはや SvFAKE と SvREADONLY のフラグを使いません。 従って、SvREADONLY は本当の読み込み専用 SV を示します。
コピーオンライトスカラを識別するには(今まで通り) SvIsCOW マクロを 使ってください。
PL_glob_index
はなくなりました。
プライベートな Perl_croak_no_modify のコンテキスト引数は削除されました。 これは void プロトタイプに二なりました。 公式 API croak_no_modify のユーザーは影響を受けません。
コピーオンライト (共有ハッシュキー) スカラはもはや読み込み専用として マークされなくなりました。 SvREADONLY
はそのような SV に対しては偽を返しますが、SvIsCOW
は真を 返すままです。
新しい op 型 OP_PADRANGE
が導入されました。 perl の覗き穴最適化器は、可能なら、pushmark に引き続く一つ以上の pad op を 単一の padrange に置き換え、また可能ならリストと nextstate op を飛ばします。 さらに、この op は my(...) = @_
の RHS に関連する作業も実行できるので、 これらの op も最適化されて消えます。
複数文字畳み込みのある [大かっこ] 文字クラスの内側の大文字小文字を無視した マッチングは、以前の状況での可能性の一つをもはや除かなくなりました。 [perl #89774]。
PL_formfeed
は削除されました。
正規表現エンジンはもはやターゲット文字列の末尾から 1 バイト過ぎて 読み込まなくなりました。 内部で整形された全てのスカラに関しては決して問題にならないはずですが、この 変更は CPAN モジュールの文字列バッファに対する賢い小技を容易にします。 [perl #73542]
BEGIN ブロックの内側で、PL_compcv
は BEGIN ブロック自身ではなく現在 コンパイルしているサブルーチンを示すようになりました。
mg_length
は廃止予定になりました。
sv_len
は常にバイトカウントを、sv_len_utf8
は文字カウントを 返すようになりました。 以前は、sv_len
と sv_len_utf8
は両方ともバグ持ちで、時々バイトを返し、 時々文字を返していました。 sv_len_utf8
はもはや引数が UTF-8 であると仮定しません。 どちらももはや tie されたり オーバーロードされたりした値や 非 PV のために UTF-8 キャッシュを作成しなくなりました。
sv_mortalcopy
は、XS モジュールから呼び出されたときに、共有ハッシュキー スカラの文字列バッファをコピーするようになりました [perl #79824]。
RXf_SPLIT
と RXf_SKIPWHITE
はもはや使われません。 これらは 0 に #define されるようになりました。
新しい RXf_MODIFIES_VARS
フラグは、正規表現の実行によって変数の変更が 起きたかも知れないことを示すためにカスタム正規表現エンジンによって 設定されます。 これによって s///
がいくつかの最適化を飛ばせるようになります。 Perl 自身の正規表現エンジンは、$REGMARK と $REGERROR を設定する特殊な バックトラック動詞のためにこのフラグを設定します。
レキシカルパッドにアクセスするための API はかなり変更されました。
PADLIST
はもはや AV
ではなく、独自の型になりました。 PADLIST
はパッドおよびパッド名のリストのための AV
ではなく、 PADNAME
の PAD
と PADNAMELIST
を含むようになりました。 PAD
, PADNAMELIST
, PADNAME
は当然ながら、普通の AV
および SV
の API ではなく、新しく追加されたパッド API 経由でアクセスできます。 詳しくは perlapi を参照してください。
正規表現 API で、番号付き捕捉コールバックは、どのマッチング変数が アクセスされたかを示すインデックスを渡されます。 $`, $&, $&
変数のための特殊インデックス値があります。 以前は、${^PREMATCH}, ${^MATCH}, ${^POSTMATCH}
を取得するのに同じ三つの 値が使われていましたが、しかしこれらは三つの別々の値が 代入されるようになりました。 "Numbered capture callbacks" in perlreapi を参照してください。
PL_sawampersand
は、以前は $`, $&, $&
のいずれかが現れたかどうかを 示す真偽値でした; それぞれの変数の存在を別々に示す 1 ビットのフラグを三つ 含むようになりました。
CV *
typemap エントリは、ちょうど &{...}
と同様に &{}
オーバーロードと型グロブに対応するようになりました [perl #96872]。
オーバーロードを示すための SVf_AMAGIC
フラグはオブジェクトではなく スタッシュ置かれるようになりました。 これはメソッドや @ISA が変更されると自動的に設定されるようになったので、 意味も変わりました。 これは「オーバーロードされる可能性がある」ことを意味するようになりました。 オーバーロードテーブルが計算されるとき、このフラグはオーバーロードがなければ 自動的にオフになるので、目立つほどの速度低下はないはずです。
オーバーロードテーブルの鮮度は、bless
の間ではなくオーバーロード メソッドが起動されたときにチェックされるようになりました。
"A" マジックはなくなりました。 SVf_AMAGIC
フラグの扱いの変更によってこれの必要がなくなりました。
PL_amagic_generation
はもはや不要となったので削除されました。 XS モジュールについては、PL_na
へのマクロ別名となりました。
フォールバックオーバーロード設定はオーバーロード自体とは分離されたスタッシュ エントリに保管されるようになりました。
文字プロセスコードはあちこちで整理されました。 変更は操作上は不可視のはずです。
study
関数は v5.16 から何もしないものになりました。 これは単に return
文を使って無効にされていました; コードはその場に 残されていました。 study
がしていたことに対応するコードは削除されました。
スレッド対応 perl では、パッケージ名を保管するために (cop->stashpv
) もはや COP 毎に別々の PV を割り当てなくなりました。 代わりに、スタッシュポインタを保持している新しい PL_stashpad
配列への オフセット (cop->stashoff
) があります。
プラグ可能な正規表現 API で、regexp_engine
構造体は新しいフィールド op_comp
を持つようになりました; これは今のところ単に perl の内部 使用のためのもので、他の正規表現プラグインモジュールによって NULL に 初期化されるべきです。
新しい関数 alloccopstash
が API に追加されましたが、実験的と 考えられています。 perlapi を参照してください。
Perl は、マジカルな値に mg_get() を多すぎる回数呼び出すことがあるコードでの バグを隠すことがある方法で get magic を実装していました。 このエラーの隠蔽はもはや起こらないので、長年のバグが目に見えるように なりました。 XS コードにマジック関連のエラーが出た場合、使っている Perl API 関数と共に、 SvGMAGICAL() 値に対して一度だけ mg_get() を呼び出しているかを チェックしてください。
CV の OP 割り当てにスラブアロケータを使うようになりました。 これは OP を CV に割り当てるためのメモリ管理を単純化するので、コンパイル エラーの後の掃除がより単純にかつ安全になりました [perl #111462][perl #112312]。
PERL_DEBUG_READONLY_OPS
は新しいスラブアロケータで動作するように 書き直され、以前よりも多くの違反を捕捉するようになりました。
PERL_IMPLICIT_SYS
と PERL_DEBUG_READONLY_OPS
のためだけに 有効化されていた op のための古いスラブアロケータは引退しました。
ヒヤドキュメント終端子は、それがファイル末尾に現れるときにはもはや改行文字で 終端される必要がなくなりました。 これは既に文字列 eval の末尾では行われていました [perl #65838]。
-DPERL_GLOBAL_STRUCT
ビルドは、グローバル構造体を、使い終わった 後に 解放するようになりました。
@INC のパスの末尾の '/' でもはや '/' を追加しなくなりました。
:crlf
層は、未読み込みデータが自身のバッファに収まらない場合でも 動作するようになりました。 [perl #112244]。
ungetc()
は UTF-8 エンコードされたデータを扱うようになりました。 [perl #116322]。
コア typemap のバグにより、T_BOOL コア typemap エントリにマッピングされている C 型は、T_BOOL 変数が RETVAL 以外の OUTPUT: 節で使われていると設定、 更新、修正されなくなっていました。 INPUT: 節の T_BOOL には影響していませんでした。 XSUB (RETVAL) に T_BOOL 返り値型を使うことには影響していませんでした。 このバグを修正した副作用は、T_BOOL は OUTPUT: 節に指定されていて(これは以前は SV に対して何もしていませんでした)、読み込み専用 SV (リテラル) が XSUB に渡された場合、"Modification of a read-only value attempted" のような croak が起こります。 [perl #115796]
多くのプラットフォームで、スクリプト名としてディレクトリ名を指定すると perl は何もせずに成功を報告していました。 これは一般的にエラーを報告して非ゼロを返すようになりました。 [perl #61362]
致命的警告の元での sort {undef} ...
はもはやクラッシュしません。 Perl v5.16 からクラッシュし始めていました。
互いに bless されたスタッシュ (bless \%Foo::, 'Bar'; bless \%Bar::, 'Foo'
) はもはや二重解放にならなくなりました。 このバグはたまたま Perl v5.16 から発生していました。
多くのメモリリークが修正されました; ほとんどは致命的警告と文法エラーに 関するものです。
'f' =~ /../g
のようなある種の失敗した正規表現マッチングは pos
を リセットしていませんでした。 また、「一度だけマッチング」パターン (m?...?g
) も、二回目に 起動されたときにこれのリセットに失敗していました [perl #23180]。
local *ISA
と local *Foo::
によって MRO キャッシュが古くなることによる いくつかのバグが修正されました。
型グロブが別名化されているときにサブルーチンを定義してももはやメソッド キャッシュは古くならなくなりました。 このバグは Perl v5.10 で発生していました。
型グロブのパッケージが親スタッシュから削除されているときにサブルーチンを含む 型グロブをローカル化してももはやエラーを出力しなくなりました。 このバグは Perl v5.14 で発生していました。
ある種の状況で、local *method=...
によってスコープ終了時に メソッドキャッシュのリセットに失敗していました。
/[.foo.]/
はもはやエラーではなく、(以前通り) 警告を出力して /[.fo]/
として扱われます [perl #115818]。
goto $tied_var
は、これがどの種類の goto か (サブルーチンかラベルか) を 決定する前に FETCH を呼び出すようになりました。
m?...?
および reset
の組み合わせでグロブ代入によって (*Foo:: = *Bar::; *Bar:: = *Baz::
) パッケージの名前を変えても、もはや スレッド付きビルドをクラッシュさせなくなりました。
リストからハッシュへの代入に関連するいくつかのバグが修正されました。 これらの多くは (1, 1, 1, 1)
のように繰り返されるキーのリストに 関連するものです。
式 scalar(%h = (1, 1, 1, 1))
は 2
ではなく 4
を返すように なりました。
リストコンテキストでの %h = (1, 1, 1)
の返り値は間違っていました。 以前は (1, undef, 1)
を返していましたが、今では (1, undef)
を返します。
Perl は ($s, %h) = (1, {})
で (%h) = ({})
と同じ "Reference found where even-sized list expected" 警告を 発生させるようになりました。
さらにいくつかの境界条件でのハッシュへのリスト代入が修正されました。 さらなる詳細についてはコミット 23b7025ebc を参照してください。
レキシカル変数に対して属性を適用してももはやメモリリークしなくなりました。 [perl #114764]
dump
, goto
, last
, next
, redo
, require
のいずれかに 裸の単語 (またはバージョン) と挿入演算子が引き続いてももはや文法エラーに ならなくなりました。 以前は (+
のような) 挿入演算子は想定されていない場所では異なる意味を 持っていました。 [perl #105924]
require a::b . 1
と require a::b + 1
はもはや間違った曖昧性警告を 生成しなくなりました。 [perl #107002]
クラスメソッド呼び出しは、英数字で始まる文字列だけでなく、任意の文字列で 可能になりました。 [perl #105922]
m///
の中で使われる、qr//
で作られるからパターンは、もはや 「空パターンは直前のパターンを再利用する」という振る舞いを 引き起こさなくなりました。 [perl #96230]
反復中にハッシュを tie してもメモリリークしなくなりました。
反復中に tie されたハッシュを解放してもメモリリークしなくなりました。
tie された配列やハッシュへのリスト代入で STORE 時に die しても メモリリークしなくなりました。
ヒントハッシュ (%^H
) が tie された場合、FETCH が die してもコンパイル時 スコープエントリ (これはヒントハッシュをコピーします) は メモリリークしなくなりました。 [perl #107000]
定数畳み込みはもはや不適切に特殊な split " "
の振る舞いを 引き起こさなくなりました。 [perl #94490]
defined scalar(@array)
, defined do { &foo }
, および同様の構文は、 defined
への引数を単純なスカラとして扱うようになりました。 [perl #97466]
*DB::DB
グロブを定義していなかったり &DB::DB
のためのサブルーチン スタブを提供しているカスタムデバッグで実行してももはやクラッシュせず、 代わりにエラーになりました。 [perl #114990]
reset ""
は文書と一致するようになりました。 reset
は引数なしで呼び出されたとき、m?...?
パターンのみを リセットします。 引数としてから文字列を指定した場合は何もしなくなりました。 (以前は引数なしとして扱われていました。) [perl #97958]
空リストを返す引数の printf
はもはや、スタックの末尾を超えて読み込んで おかしな振る舞いをしなくなりました。 [perl #77094]
--subname
はもはや間違った曖昧性警告を生成しなくなりました。 [perl #77240]
v10
は、ラベルやパッケージ名として許されるようになりました。 これは Perl v5.6 でv-文字列が追加されたときに不注意で壊れていました。 [perl #56880]
length
, pos
, substr
, sprintf
は、tie、オーバーロード、 リファレンス、型グロブの文字列化によって内部表現が UTF-8 との間で変更された ときに混乱することがありました。 [perl #114410]
utf8::encode は tie された変数で FETCH と STORE を呼び出すようになりました。 utf8::decode は STORE を呼び出すようになりました (これは FETCH は常に 呼び出していました)。
$tied =~ s/$non_utf8/$utf8/
は、tie された変数が Latin-1 文字列、 共有ハッシュキースカラ、リファレンス、あるいは ASCII または Latin-1 に 文字列化される型グロブを返すと無限ループしていましたが、もはや しなくなりました。 これは v5.12 からの退行でした。
/e なしの s///
は、先立つある種の最適化が必要になるのがいつかの検出を よりよく行うようになり、いくつかのバグっぽい場合が修正されました:
置換部のある種の構文 (&&
, ||
, ..
など) のマッチング変数; the replacement part; 例えば s/(.)/$l{$a||$1}/g
。 [perl #26986]
置換での変数のマッチングへの別名。
置換での $REGERROR
や $REGMARK
。 [perl #49190]
パターンが置換部で変数を変更するコードブロックを含むとき、最後に成功した パターンが使われることになる空パターン (s//$foo/
)。
置換文字列の汚染性はもはや s///e
の返り値の汚染性に影響しなくなりました。
$|
自動フラッシュ変数は必要なときにその場で作成されます。 現在選択されているファイルハンドルが空 IO スロットの型グロブのときに これが起きる (つまりモジュールや eval で言及される) と、 クラッシュしていました。 [perl #115206]
文字列 eval の末尾の行番号はもはや一つ行き過ぎなくなりました。 [perl #114658]
$_ にコピーオンライトスカラを設定する @INC フィルタ (@INC 内の サブルーチンによって返されるサブルーチン) はもはやパーサが文字列バッファを その場で修正しなくなりました。
length($object)
はオブジェクトが undef を返す文字列オーバーロードを 持っているときにもはや未定義値を返さなくなりました。 [perl #115260]
メソッド呼び出しのためのスタッシュ名検索キャッシュである PL_stashcache
の 使用は復元されました。
2011 年 8 月の Commit da6b625f78f5f133 は PL_stashcache
の値を見る コードを不注意で壊していました。 これは単にキャッシュなので、ほとんど全てはこれなしで動作していました。
"Can't localize through a reference" エラーは、local %$ref
が左辺値 サブルーチンの最後の行にある場合は v5.16.0 から消えていました。 \local %$ref
に対するこのエラーは perl v5.8.1 で消えていました。 これは復元されました。
ヒヤドキュメントのパースはかなり改善し、いくつかのパースのバグおよび クラッシュと一つのメモリリークが修正され、ある種の状況での間違った引き続く 行番号が修正されました。
eval の内側で、終了していないヒヤドキュメントのエラーメッセージはもはや その途中に改行を含まなくなりました [perl #70836]。
置換パターンの内側の置換 (s/${s|||}//
) はもはやパーサを 混乱させなくなりました。
コメントを認めるにはおかしな場所かもしれませんが、最初の # の前にたまたま NUL 文字が ない限り、s//"" # hello/e
は常に動作していました。 これは NUL 文字があっても動作するようになりました。
tr///
や y///
で不正な範囲を指定してももはや メモリリークしなくなりました。
文字列 eval はもはや末尾のセミコロン区切りのクォート風演算子 (eval 'q;;'
) を文法エラーとして扱わなくなりました。
warn {$_ => 1} + 1
はもはや文法エラーではなくなりました。 パーサはある種のリスト演算子の後に無名ハッシュ、そして単項演算子と 形式を共有している挿入演算子が引き続くと混乱していました。
(eval のテキストを与える) (caller $n)[6]
は実際のパーサバッファを 返していました。 これを変更するとクラッシュしていました。 これは常にコピーを返すようになりました。 返された文字列はもはや末尾に "\n;" を付け加えられなくなりました。 また返されたテキストは、以前は省略されていたヒヤドキュメントの本体を 含むようになりました。
文字列バッファと UTF-8 位置キャッシュの同期がずれることを防ぐために、 マジカル変数にアクセスしたときに UTF-8 位置キャッシュを リセットするようになりました [perl #114410]。
マジカルな UTF-8 文字列に対して二回 get magic が呼び出される様々な場合が 修正されました。
このコードは ($&
などが存在しない場合)
$_ = 'x' x 1_000_000;
1 while /(.)/;
性能上の理由によりバッファのコピーを飛ばしていましたが、元の文字列が 変更された場合 $1
などが変更されるという影響がありました。 これは修正されました。
Perl はメモリ不足メッセージの報告に PerlIO を使わなくなりました; PerlIO は より多いメモリを割り当てようとするかも知れないからです。
正規表現で、n > m
となるような {n,m}
で量が指定されると、 マッチングすることは不可能です。 以前はこれは致命的エラーでしたが、単なる警告になりました (そして マッチングはしません)。 [perl #82954].
引き続いて未定義化されたり再定義されたりしたサブルーチンで定義された フォーマットが、間違ったパッド(新しく定義された囲んでいるサブルーチン)の 変数を隠蔽することが可能で、クラッシュしたり "Bizarre copy" エラーが 出たりしていました。
実行時の XSUB の再定義は間違った行番号で警告を生成することがありました。
sprintf フォーマット %vd はαバージョンのバージョンオブジェクトに 対応していませんでした。 αバージョンが渡されるとフォーマット自身 (%vd) が出力され、 "Invalid conversion in printf" 警告が出ていました。 これはもはや起こらず、出力としてから文字列が生成されるようになりました。 また、この場合にもはやメモリリークしなくなりました。
main パッケージでの $obj->SUPER::method
呼び出しは、SUPER パッケージが 既に他の意味でアクセスされているときに失敗することがありました。
スタッシュの別名化 (*foo:: = *bar::
) によって SUPER 呼び出しが メソッドや @ISA の変更を無視したり間違ったパッケージを使ったりしていましたが、 もはやこれは起こらなくなりました。
名前が ::SUPER で終わるパッケージでのメソッド呼び出しはもはや、 SUPER メソッド呼び出しと扱われてメソッド検索に失敗することがなくなりました。 さらに、そのようなパッケージでのサブルーチンを定義しても、もあはやそれを 含んでいるパッケージでの SUPER メソッド呼び出しによって 見つからなくなりました [perl #114924]。
\w
は符号位置 U+200C (ZERO WIDTH NON-JOINER) と U+200D (ZERO WIDTH JOINER) にマッチングするようになりました。 \W
はもはやこれらにはマッチングしません。 この変更は、Unicode が \w
で何がマッチングするべきかの定義を 修正したからです。
dump LABEL
はもはやラベルをリークしなくなりました。
定数畳み込みはもはや stat()
や truncate()
のようなファイル名と ハンドルのどちらかを取る関数の振る舞いを変更しなくなりました。 stat 1 ? foo : bar
は (任意の式なので) ハンドル "foo" ではなく、引数を ファイル名として扱うようになりました。
truncate FOO, $len
は、ファイルハンドルが既に削除されていた場合にもはや "FOO" をファイル名として扱うようにフォールバックしなくなりました。 これは Perl v5.16.0 で壊れていました。
サブルーチンからグロブまたはグロブからグロブへの代入の後サブルーチンを 再定義してももはや二重解放やパニックメッセージを引き起こさなくなりました。
s///
は、例え結果の文字列が同じ (s/a/a/
) でも、置換を行うときに v-文字列から通常の文字列への変換を行うようになりました。
プロトタイプ不一致警告は、実際にはプロトタイプが "" である定数サブルーチンを もはや間違ってプロトタイプがないものとして扱わなくなりました。
定数サブルーチンと前方宣言は、もはやサブルーチン名を省略することから プロトタイプ不一致警告を妨げなくなりました。
サブルーチンでの undef
は呼び出しチェッカをクリアするようになりました。
ref
演算子は Perl v5.16.0 から bless されたオブジェクトでメモリを リークさせていました。 これは修正されました [perl #114340]。
use
はもはや引数を文としてパースしようとして use constant { () };
を 文法エラーにしなくなりました [perl #114222]。
デバッグビルドで、フォーマットの内側での "uninitialized" 警告はもはや アサーション失敗を引き起こさなくなりました。
デバッグビルドで、フォーマットの内側でネストしたサブルーチンはもはや アサーション失敗を引き起こさなくなりました [perl #78550]。
フォーマットと use
文はフォーマットの内側でも使えるようになりました。
print $x
と sub { print $x }->()
は常に同じ出力を 生成するようになりました。 後者は、変数がアクティブでない場合、つまり現在実行されている名前付き サブルーチンの外側で定義された場合、 $x を超えて閉じることを拒否することが 可能でした。
同様に、print $x
と print eval '$x'
は同じ出力を生成するように なりました。 また、これによって "my $x if 0" 変数がデバッガで見えるようになります [perl #114018]。
再帰的に呼び出されるフォーマットはもはや自分自身のレキシカル変数を壊さず、 再帰呼び出し毎に独自のレキシカルの集合を持つようになりました。
アクティブなフォーマットやそれに関連づけられているハンドルを 解放しようとしてももはやクラッシュしなくなりました。
フォーマットのパーサはもはや中かっこ、セミコロン、優先順位の低い演算子で 混乱しなくなりました。 フォーマットの区切り文字に (=
と .
の代わりに) 中かっこを使うことが できましたが、時々だけでした。 パーサは、もはやフォーマット引数のセミコロンおよび優先順位の低い演算子で 混乱してその行の返り値を無視しなくなりました。 フォーマット引数行では、中かっこは常に do
ブロックとして 扱われるのではなく、無名ハッシュとして使われるようになりました。
フォーマットは正規表現のコードブロックやその他のクォート構文 (/(?{...})/
と qq/${...}/
) の内側でネスト出来るようになりました [perl #114040]。
フォーマットはコンパイルエラーの後ではもはや作られなくなりました。
デバッグビルドでは、-DA コマンドライン引数は Perl v5.16.0 から クラッシュしていました。 これは修正されました [perl #114368]。
iスレッド付きの Windows ビルドでの疑似 fork された子の早すぎる終了に 関連する潜在的なデッドロックシナリオは修正されました。 これは Windows で t/op/fork.t テストがハングするという一般的な問題を 解決します [perl #88840]。
require()
からのエラーを生成するコードは、3 文字より短く /\.p?\z/
で 終わっているファイル名に対してファイル名の先頭より 1 または 2 バイト手前を 読む可能性がありました。 これは修正されました。 これはどちらにしろ use()
や require()
で指定されたモジュール名では 決して起きていなかったことに注意してください。
require()
で与えられるモジュールのパス名の扱いが VMS で スレッドセーフになりました。
非ブロックソケットは VMS で修正されました。
Pod は文字列 eval の外側のクォートされた構文の内側の構文で ネストできるようになりました。 これは文字列 eval の内側でだけ動作していました [perl #114040]。
goto ''
はプログラムを終了させるのではなく、空ラベルを探して、 "goto must have label" エラーメッセージを生成するようになりました [perl #111794]。
goto "\0"
は "goto must have label" ではなく "Can't find label" で die するようになりました。
C 関数 hv_store
は %^H
に対して使われるとクラッシュしていました [perl #111000]。
cv_set_call_checker
経由でクロージャプロトタイプに付けられた 呼び出しチェッカは、そこからクローンされたクロージャに コピーされるようになりました。 これにより、cv_set_call_checker
はクロージャのための属性ハンドラの内側で 動作するようになりました。
$^N
への書き込みは何も起きていませんでした。 これはデフォルトでは "Modification of a read-only value" で croak するようになりましたが、$1
と同様カスタム正規表現エンジンで 上書きできます [perl #112184]。
制御文字グロブ に対する undef
(undef *^H
) はもはや曖昧性に関する 間違った警告を出力しなくなりました [perl #112456]。
性能のために、多くの演算子と組み込み関数は毎回同じスカラを返します。 しかし、左辺値サブルーチンと CORE:: 名前空間のサブルーチンではこの実装詳細が リークを起こしていました。 print &CORE::uc("a"), &CORE::uc("b")
は "BB" を表示していました。 同じことは uc
の返り値を返す左辺値サブルーチンでも起きていました。 このような場合では値はコピーされるようになりました。
空ブロックや空リストを返すブロックでの method {}
文法はクラッシュしたり 呼び出し元としてスタックにランダムな値を残したりしていました。 これはエラーを生成するようになりました。
vec
は極端に大きなオフセット (>2 GB) でも動作するようになりました [perl #111730]。
オーバーロード設定の変更は直ちに効果を持つようになりました; オーバーロードに 影響する継承を変更するからです。 以前は bless
の後で飲み効果を持っていました。
クラスがオーバーロードを持つ前に作られたオブジェクトは、例え use overload
や @ISA の変更によってクラスにオーバーロードを得たり、 bless
の後でさえも、オーバーロードなしのままでした。 これは修正されました [perl #112708]。
オーバーロードのあるクラスはフォールバック値を継承するようになりました。
オーバーロードは、+=
のような代入演算子の両側がオーバーロードされた オブジェクトの場合、フォールバック値 0 を考慮していませんでした [perl #111856]。
pos
はハッシュや配列を引数に取ると間違った警告を生成するのではなく、 croak するようになりました。
while(each %h)
は readline
や readdir
と同様、 while(defined($_ = each %h))
を暗示するようになりました。
CORE:: 名前空間のサブルーチンは、undef *_
の後引数リストなしで 呼び出しても (かっこなしの &CORE::time
) もはやクラッシュしなくなりました。
unpack
は、間違ったデータのときにもはや "'/' must follow a numeric type in unpack" エラーを生成しなくなりました [perl #60204]。
join
と "@array"
は tie された $"
に対して FETCH を一度だけ 呼び出すようになりました [perl #8931]。
CORE::GLOBAL
オーバーライドによって影響を受けるコア op の コンパイルによって生成された一部のサブルーチン呼び出しは op チェックを 2 回実行していました。 このチェックはピュア Perl コードでは常に冪等ですが、二重チェックは カスタム呼び出しチェッカが関わっているときは問題になるかもしれません。
親と子の両方で扱われるシグナルを親に送る異なる fork 関係の競合条件が 存在していました。 このようなことが起こるのを防ぐために、シグナルは fork の間一時的に ブロックされるようになりました [perl #82580]。
(?{})
や (??{})
のような、正規表現中のコードブロックの実装は、 大量のバグを取り除くために大きく再作業されました。 ユーザーから見える主な変更は:
パターンの内側のコードブロックは周りのコードと同じパスで パースされるようになりました; 特に、釣り合った中かっこはもはや 必要ではありません: 以下のものは動作するようになりました:
/(?{ $x='{' })/
これは、このエラーメッセージはもはや生成されないと言うことです:
Sequence (?{...}) not terminated or not {}-balanced in regex
しかし新しいエラーが起こります:
Sequence (?{...}) not terminated with ')'
さらに、実行時パターンの内側でのリテラルなコードブロックは、perl の コンパイル時に一度だけコンパイルされます:
for my $p (...) {
# this 'FOO' block of code is compiled once,
# at the same time as the surrounding 'for' loop
/$p{(?{FOO;})/;
}
レキシカル変数はスコープ、再帰、クロージャの振る舞いに関して まともになりました。 特に、/A(?{B})C/
は (クロージャからの視点では) 正確に /A/ && do { B } && /C/
と同様で、一方 qr/A(?{B})C/
は sub {/A/ && do { B } && /C/}
と同様です。 従って以下のコードは想定しているであろう通りに動作し、0, 1, 2 に マッチングする三つの正規表現を作成します:
for my $i (0..2) {
push @r, qr/^(??{$i})$/;
}
"1" =~ $r[1]; # matches
use re 'eval'
プラグマは実行時に定義されたコードブロックでのみ 要求されるようになりました; 特に以下のように、$r
パターンのテキストは 新しいパターンに展開されて再コンパイルされるままですが、$r
の中の コンパイルされた個々のコードブロックはコンパイルされず再利用されるようになり、 use re 'eval'
はもはや必要なくなりました:
my $r = qr/abc(?{....})def/;
/xyz$r/;
フロー制御演算子はもはやクラッシュしなくなりました。 それぞれのコードブロックは新しい動的スコープで実行されるので、next
などは 囲んでいるループを見ません。 return
は囲んでいるサブルーチンからではなく、コードブロックからの値を 返します。
Perl は普通実行時パターンのコンパイルをキャッシュし、パターンが 変更されなければ再コンパイルしませんが、クロージャの正しい振る舞いのために 要求された場合無効化されるようになりました。 例えば:
my $code = '(??{$x})';
for my $x (1..3) {
# recompile to see fresh value of $x each time
$x =~ /$code/;
}
/msix
や (?msix)
などのフラグは (??{})
からの返り値に 伝搬するようになりました; 以下のものは動作するようになりました:
"AB" =~ /a(??{'b'})/i;
警告とエラーは re_eval
からではなく周りのコード (または実行時 コードブロックの場合は eval) から起こるように見えるようになりました:
use re 'eval'; $c = '(?{ warn "foo" })'; /$c/;
/(?{ warn "foo" })/;
以前は以下のようになっていました:
foo at (re_eval 1) line 1.
foo at (re_eval 2) line 1.
今では以下のようになります:
foo at (eval 1) line 1.
foo at /some/prog line 2.
Perl は全てのリリースの Unicode を使って再コンパイル出来るようになりました。 v5.16 では、Unicode 6.0 と 6.1 では動作していましたが、それ以前の リリースを使うと、様々なバグがありました; リリースが古いものほど多くの問題が ありました。
vec
はもはや左辺値コンテキストで "uninitialized" 警告を 生成しなくなりました [perl #9423]。
正規表現での固定文字列に関する最適化は、極端な状況で大きな性能上の ペナルティを引き起こしていました。 これは修正されました [perl #76546]。
ある種の状況では、((?:)
や (?:|)
のように) 正規表現中に空部分パターンを 含んでいると一部の最適化が無効になることがありました。 これは修正されました。
"CORE::nonexistent_keyword" のような文字列が渡されたときに prototype
が 生成する "Can't find an opnumber" メッセージは、UTF-8 と組み込みの NUL を 無変更で渡すようになりました。
prototype
は、CORE:: 前置詞をチェックするとき、$1
のようなマジカル 変数を、サブルーチン名として扱うのではなく、非マジカル変数と同じように 扱うようになりました。
スレッド化 perl では、正規表現内の実行時コードブロックは構文木に保管された パッケージ名を壊して、caller
で間違った結果を読んだり、クラッシュする 可能性がありました [perl #113060]。
クロージャプロトタイプの参照 (クロージャのための属性ハンドラでの \&{$_[1]}
) はもはやサブルーチンのコピー (またはデバッグビルドでの アサーション失敗) を引き起こさなくなりました。
eval '__PACKAGE__'
は、(*ThisPackage:: = *ThatPackage::
のように) 現在のパッケージが上書きされた場合、スレッド化ビルドで正しい答えを 返すようになりました [perl #78742]。
呼び出したコードでパッケージが削除されると、caller
が削除された パッケージが所有するスタックフレームを見る可能性がありました。 スタッシュのメモリアドレスがスカラに再利用され、置換が同じスカラで 実行されると、caller
がクラッシュすることがありました [perl #113486]。
UNIVERSAL::can
は、もはや最初の引数が内部で文字列か数値かに依存して 異なった扱いをしなくなりました。
モードに <&
を持つ open
は、ファイル記述子として扱うか ハンドル名として扱うかを決定するために、第 3 引数が数値かどうかを チェックします。 $1
のようなマジカル変数は常に数値チェックに失敗し、ハンドル名として 扱われます。
マジカル変数 ($1
, tie) の warn
の扱いはいくつか修正されました。 FETCH
は tie された引数や tie された $@
で一度だけ 呼び出されるようになりました [perl #97480]。 "" に文字列化されるオブジェクトを返す tie された変数はもはや 無視されなくなりました。 tie された $@
がたまたま 前回 使われたリファレンスを返しても もはや無視されなくなりました。
warn ""
は、たまたま $@=3
経由か $@="3"
経由かに関わらず、 $@
を同じように数値として扱うようになりました。 以前は前者は無視していました。 常に $@="3"
で行われていたように、"\t...caught" が 追加されるようになりました。
マジカル変数に対する数値演算子 (例えば $1 + 1
) は、整数演算が より適切な場合でも浮動小数点数演算を使っていて、64-ビットプラットフォームで 精度を失っていました [perl #109542]。
単項否定は、文字列がどこかで数値として使われていても、もはや文字列を 数値として扱わなくなりました。 それで、$x
に文字列 "dogs" を含んでいると、例え $y=0+$x
がどこかで あっても、-$x
は "-dogs" を返します。
Perl v5.14 で、-'-10'
は "+10" ではなく "10" を返すように修正されました。 しかしマジカル変数 ($1
, tie) は今まで修正されていませんでした [perl #57706]。
単項否定は内部 UTF8
フラグに関わらず文字列を一貫性を持って 扱うようになりました。
Perl v5.16.0 で導入された、tr/
SEARCHLIST
/
REPLACEMENTLIST
/
に 関連する退行が修正されました。 ある文字が複数回 SEARCHLIST
に現れると、最初の実体のみが 意味を持つことになっています。 ある種の状況では、最後の実体がその前のものを上書きしていました。 [perl #113584]
qr/\87/
のような正規表現は以前は暗黙に NUL 文字を挿入し、従って qr/\00087/
と書かれていたかのようにマッチングしていました。 これは、並び "\8"
が認識出来ないというメッセージと共に、 qr/87/
と書かれていたかのようにマッチングするようになりました。
__SUB__
は特殊ブロック (BEGIN
, END
など) でも動作するように なりました。
Windows でのスレッド作成は、BEGIN
ブロックの内側で行われると、理論的には クラッシュすることがありました。 これはまだ適切に動作しませんが、もはやクラッシュすることはなくなりました [perl #111610]。
\&{''}
(with the empty string) はその他のサブルーチン名と同様にスタブを 自動有効化し、もはや "Unable to create sub" エラーを生成しなくなりました [perl #94476]。
re
モジュールへの一部の呼び出しが $_
を上書きするという、v5.14.0 で 導入された退行が修正されました [perl #113750]。
do FILE
は、例えファイルが読み込めなくても、$@
を設定または クリアします。 これにより、(文書で勧められているように) 先に $@
をテストすると常に 正しい結果を返します。
each @array
構文で使われる配列反復子は、@array
がクリアされたときに 正しくリセットされるようになりました [perl #75596]。 これは例えば @array = (...)
のように配列がグローバルに代入されたときに 起き、その 値 が代入された時には起きません。 XS API に関して、これは av_clear()
は反復子をリセットするということです。
これはハッシュがクリアされたときのハッシュ反復子の振る舞いを反映しています。
$class->can
, $class->isa
, $class->DOES
は、 $class
で参照しているパッケージが存在するかどうかに関わらず、正しい結果を 返すようになりました [perl #47113]。
シグナルが届いてももはや $@
をクリアしなくなりました [perl #45173]。
空変数リストの my ()
宣言が許されるようになりました [perl #113554]。
パース中、エラーの後に宣言されたサブルーチンはもはやスタブを 残さなくなりました [perl #113712]。
文字列 eval を含まないクロージャはもはや含んでいるサブルーチンでハングせず、 内側のサブルーチンがまだ存在しているにも関わらず外側のサブルーチンが 解放されたとき、解放された外側のサブルーチンによって変数が 隠蔽されなくなりました [perl #89544]。
"<&=" または ">&=" のモードで開くことでのメモリ内ファイルハンドルの複製は、 v5.16.0 から適切に動作しなくなっていました。 これにより新しいハンドルが異なったスカラ変数を参照することになっていました。 これは修正されました [perl #113764]。
qr//
式は、もはや正規表現のコンパイル時に offs
を設定しないカスタム 正規表現エンジンでクラッシュしなくなりました [perl #112962]。
delete local
はもはやある種のマジカルな配列やハッシュで クラッシュしなくなりました [perl #112966]。
ある種のマジカルな配列やハッシュの要素に対する local
は、例え要素が local
の前に存在していなくても、スコープ終了時に要素の削除を 手配していませんでした。
scalar(write)
はもはや複数のアイテムを返さなくなりました [perl #73690]。
文字列から浮動小数点数への変換はもはや use locale
の基である種の文字列の パースを間違わなくなりました [perl #109318]。
die する @INC
フィルタはもはやメモリリークしなくなりました [perl #92252]。
オーバーロードされた演算子の実装は正しいコンテキストで呼び出されるように なりました。 これにより、特に <>
を適切にオーバーライド出来るようになりました [perl #47119]。
use overload
を呼び出すときに fallback
キーのみを指定されても 正しく振る舞うようになりました [perl #113010]。
sub foo { my $a = 0; while ($a) { ... } }
と sub foo { while (0) { ... } }
は同じものを返すようになりました [perl #73618]。
文字列否定は use integer;
が指定されているときも指定されていないときと 同じように振る舞うようになりました [perl #113012]。
chr
は -1 に対して内部表現に関わらず Unicode 置換文字 (U+FFFD) を 返すようになりました。 引数が tie されていたり内部で文字列の場合 -1 が回り込んでいました。
フォーマットが外側のサブルーチンからのレキシカル変数を参照しているときに 囲んでいるサブルーチンが解放されてから format
を使うと、perl v5.12.0 以降 クラッシュしていました。
フォーマットが外側のサブルーチンからのレキシカル変数を参照しているときに 囲んでいるサブルーチンが未定義化されてから format
を使うと、perl v5.10.0 以降クラッシュしていました。
外側からのレキシカル変数を参照するような、クロージャの内側で定義された format
の使用は、write
呼び出しが直接クロージャの内側でない限り 実際には動作していませんでした。 v5.10.0 ではクラッシュし始めていました。 これらの変数を探すために、呼び出しスタックの先頭にもっとも近いクロージャの コピーが使われるようになりました。
特殊ブロックがコンパイルされる前に特殊ブロックと同じ名前のスタブが 存在する場合、特殊ブロックの変数を隠すフォーマットはもはや クラッシュしなくなりました。
print;
が前にあるとパーサが混乱して eval foo ()
を文法エラーとして 扱っていましたが、これはもはや起こらなくなりました [perl #16249]。
syscall
の返り値はもはや 64-ビットプラットフォームで 切り詰められなくなりました [perl #113980]。
定数畳み込みはもはや print 1 ? FOO : BAR
で FOO ハンドルを 表示しなくなりました [perl #78064]。
do subname
は、"subname" というファイルを開くのではなく、名前付き サブルーチンを呼び出してその返り値をファイル名として使うようになりました。
(XS モジュールによって登録される) rv2cv チェックフックによる サブルーチン検索は、foo bar
がサブルーチン呼び出し foo(bar)
か メソッド呼び出し "bar"->foo
かをいつ決定するかを考慮に 入れるようになりました。
CORE::foo::bar
はもはや特別に扱われなくなり、 CORE::GLOBAL::uc(...)
経由で直接呼び出せるグローバルなオーバーライドが 可能になりました [perl #113016]。
型グロブが未定義である、未定義サブルーチンを呼び出すと、 "Not a CODE reference" ではなく、通常の "Undefined subroutine called" エラーが生成されるようになりました。
@ISA に関連する二つのバグが修正されました。 *ISA = *glob_without_array
と undef *ISA; @{*ISA}
は、@ISA の将来の 変更が、メソッド検索に使われる内部キャッシュを更新することを妨げていました。 *glob_without_array の場合は Perl v5.12 からの退行でした。
正規表現最適化によって /m
付きの $
がマッチングに失敗したり間違ったり していました [perl #114068]。
__SUB__
は sort
ブロックで、内側のサブルーチンが sub foo;
文法で 先行宣言されているときに動作するようになりました [perl #113710]。
Unicode 特性は Unicode 符号位置にのみ適用されるため、正規表現が 上位 Unicode 符号位置に対してマッチングするときに微妙なことが起こります。 これに注意を向けるために生成される警告があります。 しかしこの警告は、プログラムがパースされたときのような一部の場合に 不適切に生成されていました。 \w
や [:word:]
のような非 Unicode マッチングは、定義上 Unicode 符号位置にだけ適用するように制限されていないので、この警告を 生成するべきではありません。 このメッセージは \p{}
および \P{}
に対してマッチングするときにのみ 生成されるようになりました。 単に単一の符号位置にマッチングする Unicode のごく僅かな特性に関する [perl #114148] バグが残っています。 上述の Unicode 符号位置に対してマッチングする場合は警告は生成されません。
ハッシュ要素に言及する未初期化警告は、ハッシュの最初のバケツ以外だった場合、 off-by-one エラーによって、要素名だけに言及していました。
正規表現最適化器のバグにより、複数行 "^" が改行の存在を正しく扱えず、 "/\n\n" =~ m#\A(?:^/$)#im
のようなものががマッチングしないことが ありました [perl #115242]。
リストコンテキストで fork
が失敗してももはやスタックが壊れなくなりました。 @a = (1, 2, fork, 3)
は、fork
が失敗すると 2 を食べてしまって (1, undef, 3)
を代入していました。
様々なメモリリークが修正されました; ほとんどは die した tie 変数、 正規表現文字クラスとコードブロック、文法エラーに関するものです。
正規表現 (${qr//}
) を、たまたま浮動小数点数を保持していた変数に 代入しても、もはやデバッグビルドでアサーション失敗を 引き起こさなくなりました。
数値を保持していたスカラに正規表現を代入しても、もはや引き続く数値化が ランダムな数値を生成しなくなりました。
正規表現のマジカル変数への代入はもはやマジックを削除しなくなりました。 これは v5.10 からの退行でした。
正規表現の bless された変数への代入はもはやクラッシュしなくなりました。 これも v5.10 からの退行でした。
正規表現は、文字列に平坦化されて tie されたハッシュや配列に 代入できるようになりました。
正規表現の数値化はもはや非初期化警告を出さなくなりました。
tie された変数に対する負数の配列インデックスはもはや EXISTS メソッドを 無視しなくなりました。 これは v5.12 からの退行でした。
非オブジェクトに tie された配列に対する負数の配列インデックスはもはや クラッシュしなくなりました。
$byte_overload .= $utf8
は、左側のスカラがたまたま最後にオーバーロードが 起動されたときに UTF-8 文字列を生成していたときにも、もはや二重に UTF-8 に エンコードされなくなりました。
goto &sub
は、サブルーチンがもともと呼ばれたときのものではなく、現在の 値の @_ を使うようになりました。 これは、local @_ = (...); goto &sub
が動作するようになったということです [perl #43077]。
デバッガが再帰的に起動されたとき、もはや自分自身のレキシカル変数を 踏みつけなくなりました。 以前は再帰したときには全ての呼び出しは同じレキシカル変数の集合を 共有していました [perl #115742]。
サブルーチンから返された *_{ARRAY}
はもはや自然に空にならなくなりました。
HP-UX 11.00 での %ENV
内の UTF8 フラグがついた文字列はバグがある
HP-UX 11.00 での UTF8 フラグ付きの文字列と %ENV
の相互作用は現在の所 まだ完全に診断されていない形の危険があります。 t/op/magic.t での想定されているテスト失敗に引き続いて、環境にワイド文字を 保管すると明らかでない振る舞いがあります。
韓国ソウルの 24 才 Hojung Yoon (AMORETTE) は、ラマの人形およびサイン入り TIMTOADY カードと共に長い眠りにつきました。 彼は素晴らしい若手 Perl 5 & 6 ハッカーであり、Seoul.pm の献身的な メンバーでした。 彼は Perl をプログラムし、Perl を話し、Perl を食べ、Perl を愛していました。 私たちは、彼が今でもどこかで彼の壊れた IBM ラップトップで Perl で プログラミングしていると信じています。 お悔やみを申し上げます。
Perl v5.18.0 は、Perl v5.16.0 以降、113 人の作者によって、 2,100 のファイルに約 400,000 行の変更を加えて、 約 12 months開発されてきました。
Perl は、活気のあるユーザーと開発者のコミュニティのおかげで 20 年を超えて 繁栄しています。 以下の人々が、Perl v5.18.0 になるための改良に貢献したことが分かっています:
Aaron Crane, Aaron Trevena, Abhijit Menon-Sen, Adrian M. Enache, Alan Haggai Alavi, Alexandr Ciornii, Andrew Tam, Andy Dougherty, Anton Nikishaev, Aristotle Pagaltzis, Augustina Blair, Bob Ernst, Brad Gilbert, Breno G. de Oliveira, Brian Carlson, Brian Fraser, Charlie Gonzalez, Chip Salzenberg, Chris 'BinGOs' Williams, Christian Hansen, Colin Kuskie, Craig A. Berry, Dagfinn Ilmari Mannsåker, Daniel Dragan, Daniel Perrett, Darin McBride, Dave Rolsky, David Golden, David Leadbeater, David Mitchell, David Nicol, Dominic Hargreaves, E. Choroba, Eric Brine, Evan Miller, Father Chrysostomos, Florian Ragwitz, François Perrad, George Greer, Goro Fuji, H.Merijn Brand, Herbert Breunung, Hugo van der Sanden, Igor Zaytsev, James E Keenan, Jan Dubois, Jasmine Ahuja, Jerry D. Hedden, Jess Robinson, Jesse Luehrs, Joaquin Ferrero, Joel Berger, John Goodyear, John Peacock, Karen Etheridge, Karl Williamson, Karthik Rajagopalan, Kent Fredric, Leon Timmermans, Lucas Holt, Lukas Mai, Marcus Holland-Moritz, Markus Jansen, Martin Hasch, Matthew Horsfall, Max Maischein, Michael G Schwern, Michael Schroeder, Moritz Lenz, Nicholas Clark, Niko Tyni, Oleg Nesterov, Patrik Hägglund, Paul Green, Paul Johnson, Paul Marquess, Peter Martini, Rafael Garcia-Suarez, Reini Urban, Renee Baecker, Rhesa Rozendaal, Ricardo Signes, Robin Barker, Ronald J. Kimball, Ruslan Zakirov, Salvador Fandiño, Sawyer X, Scott Lanning, Sergey Alekseev, Shawn M Moore, Shirakata Kentaro, Shlomi Fish, Sisyphus, Smylers, Steffen Müller, Steve Hay, Steve Peters, Steven Schubiger, Sullivan Beck, Sven Strickroth, Sébastien Aperghis-Tramoni, Thomas Sibley, Tobias Leich, Tom Wyant, Tony Cook, Vadim Konovalov, Vincent Pit, Volker Schatz, Walt Mankowski, Yves Orton, Zefram.
これはバージョンコントロール履歴から自動的に生成しているので、ほぼ確実に 不完全です。 特に、Perl バグトラッカーに問題を報告をしてくれた (とてもありがたい)貢献者の 名前を含んでいません。
このバージョンに含まれている変更の多くは、Perl コアに含まれている CPAN モジュール由来のものです。 私たちは Perl の発展を助けている CPAN コミュニティ全体に感謝します。
全ての Perl の歴史的な貢献者のより完全な一覧については、どうか Perl ソース 配布に含まれている AUTHORS を参照してください。
もしバグと思われるものを見つけたら、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 ファイル。