use feature 'unicode_strings'
の完全な機能\N{NAME}
と charnames
の拡張(?^...)
構造はデフォルト修飾子を示します/d
, /l
, /u
, /a
修飾子use re '/flags'
\p{Title}
の同義語としての \p{Titlecase}
delete $+{...}
の返り値package
ブロック文法$0
への代入は Linux では prctl()
を使って伝統的なプロセス名を設定しますsrand()
は種を返すようになりました${^GLOBAL_PHASE}
-d:-foo
は Devel::foo::unimport
を呼び出します\p{}
特性は大文字小文字なしのマッチングから免除されるようになりましたlocal($_)
は $_ から全てのマジカルな機能を取り去りますgiven
の返り値:=
は文法エラーになりました\cX
"\b{"
と "\B{"
$[
へのリスト代入\N{BELL}
?PATTERN?
shift()
と pop()
の最適化PL_*
アクセサ関数の削除@_
のメモリ消費が減りました%+
と %-
のメモリ消費が減りました\xHH
エスケープと \oOOO
エスケープの説明SvTRUE
マクロuse locale
とフォーマットcaller()
への C インターフェースLINKLIST
find_rundefsv
Perl_croak_no_modify
PERL_STATIC_INLINE
定義pv_escape
オプションlex_start
op_scope()
と op_lvalue()
PERL_POLLUTE
は削除されましたGvCV()
と GvGP()
はもはや左辺値ではありませんCvGV()
はもはや左辺値ではありませんCvSTASH()
はもはや左辺値ではありませんnewFOROP
と newWHILEOP
の呼び出し規約uvuni_to_utf8_flags
と utf8n_to_uvuni
に渡されるフラグ
perldelta - perl v5.14.0 での変更点
この文書は 5.12.0 リリースと 5.14.0 リリースの変更点を記述しています。
5.10.0 のような以前のメジャーバージョンから更新する場合は、まず 5.10.0 と 5.12.0 の違いについて記述している perl5120delta を読んでください。
このリリースで修正されたバグのいくつかは 5.12.x のリリースに バックポートされました。 そのようなものはかっこの中に 5.12.x のバージョン番号を書いて示しています。
perlpolicy に記述されているように、Perl 5.14.0 によって Perl 5.10 の サポートが公式に終了します。 Perl 5.10 以前のユーザーはより新しい Perl にアップグレードすることを 検討するべきです。
Perl は Corrigendum #8 で 更新された Unicode 6.0 データベースを同梱していますが、後述する 一つの例外があります。 新しいリリースについて詳しくは http://unicode.org/versions/Unicode6.0.0/ を参照してください。 Perl は、このリリースで新しいものを含む、全ての Unicode 仮特性は 対応していません。
Unicode 6.0 は文字 U+1F514 に BELL
という名前を選びました;
これは日本の携帯電話で使われている、ベルのような形のシンボルです。
これは、BELL
が ASCII BEL
U+0007 を意味するという、長年の
Perl の利用法と衝突します。
Perl 5.14 では、\N{BELL}
は U+0007 を意味するままですが、非推奨
警告をオフにしていない限りは非推奨警告メッセージが出力されます。
Perl での U+0007 の新しい名前は ALERT
です; これは既にある
短縮記法である "\a"
といい感じに対応します。
\N{BEL}
は U+0007 を意味し、警告も出ません。
5.14 では文字 U+1F514 に名前はありませんが、 \N{U+1F514}
で
参照できます。
Perl 5.16 では \N{BELL}
は U+1F514 を参照します;
\N{BELL}
を使っている全てのコードはアップグレードする前に \N{ALERT}
,
\N{BEL}
, "\a"
のいずれかを使うように変換するべきです。
use feature 'unicode_strings'
の完全な機能このリリースでは use feature 'unicode_strings'
に関する完全な機能が
提供されます。
このスコープ内では、全ての文字列操作の処理と正規表現のコンパイルは
(たとえ実行はスコープ外でも) Unicode の意味論を持ちます。
feature/"the 'unicode_strings' feature" を参照してください。
しかし、後述する
反転させた大かっこ文字クラスと複数文字の折り畳み を
参照してください。
この機能はほとんどの形の「Unicode バグ」(詳しくは perlunicode/The "Unicode Bug" を参照してください。) を回避します。 もしコード中で Unicode 文字列を操作する可能性があるなら、 不快な驚きを回避するためにこの副プラグマを使うことを 強く 推奨します。
\N{NAME}
と charnames
の拡張\N{NAME}
と charnames::vianame
は NBSP, SHY, LRO, ZWJ のような、
Unicode によってリストされている短縮文字名、
(ACK, BEL, CAN などのような)C0 と C1 制御文字の慣例的省略形、
一般的に使われている C1 完全名のいくつかのバリエーションを
認識するようになりました。
Unicode には多くの 名前付き文字シーケンス (named character sequences) が
あり、特定の符号位置の並びには名前があります。
\N{NAME}
はこれを認識するようになりました。
\N{NAME}
, charnames::vianame
, charnames::viacode
は Unicode の
全ての文字を認識するようになりました。
Perl の以前のリリースでは、ハングル音節文字や CJK (中国/日本/韓国) の多くの
文字を認識していませんでした。
Perl の省略型を独自の別名でオーバーライドできるようになりました。
\N{NAME}
, charnames::vianame()
, charnames::viacode()
が
認識する文字の番号への独自の別名を作成できるようになりました。
以前は、別名は公式の Unicode 文字名に対するものである必要がありました。
これにより、プライベート用途のために予約されている符号位置のように
名前のない符号位置に対する別名を作ることができませんでした。
新しい関数である charnames::string_vianame() は
\N{NAME}}
の実行時版で、引数の Unicode 名を持つ文字の
文字列を返します。
これは Unicode の名前付き文字の並びを扱うことができます;
一方既にある charnames::vianame() は一つの符号位置を返すので
扱うことができません。
これら全ての変更について詳しくは charnames を参照してください。
"utf8" 副カテゴリに三つの新しい警告が追加されました。
これらによって "utf8" 警告をの一部をオフにできるようにして、残りを
警告するままにできるようになります。
三つのカテゴリとは:
UTF-16 サロゲートに遭遇したときの surrogate
;
Unicode の非文字符号位置に遭遇したときの nonchar
;
Unicode の正当な上限である 0x10FFFF を超える符号位置に遭遇したときの
non_unicode
です。
このリリースでは、Perl は(Unicode として正当でない符号位置でも)全ての
符号なし値を符号位置として扱い、警告なしで
(utf8 として)内部でエンコードできるモデルを採用しています。
しかし、utf8 やそれに対応する(前述した)副カテゴリの警告を明示的に
レキシカルにオフにしない限り、このような
符号位置に対して(大文字化のような) Unicode が定義している出力や操作を行うと
警告が生成されます。
(:encoding('UTF-8')
層を使うような) 厳密なルールを使っての
このような値の入力は失敗するままです。
このリリースの前では、扱いは非常に矛盾していて、あちこちで間違っています。
非 Unicode 文字 (その一部は以前は Unicode 標準に反して Perl では 間違って不正なものとされていました) は常に内部で有効なものとなりました。 それらの入出力は、Unicode 標準が「開かれた交換」のため(だけ)に不正で あると言っているように、不正な Unicode 符号位置と同様に動作します。
Unicode データベースファイルは Perl にインストールされなくなりました。 これは Perl の機能には何の影響も与えず、かなりのディスク容量を節約します。 これらのファイルが必要な場合は、 http://www.unicode.org/Public/zipped/6.0.0/ からダウンロードできます。
(?^...)
構造はデフォルト修飾子を示します正規表現中、ASCII キャレット "^"
の直後に "(?"
があると、
(/i
のような)それを囲む修飾子を継承せず、
Perl のデフォルトに戻ることを意味するようになりました。
キャレットに引き続く任意の修飾子はデフォルトを上書きします。
正規表現の文字列化はこの記法を使うようになりました。
例えば、以前は qr/hlagh/i
は (?i-xsm:hlagh)
に
文字列化されていましたが、(?^i:hlagh)
に文字列化されるようになります。
この変更の主な目的は、新しい修飾子が追加されたときに変更する必要の ない 文字列化に依存したテストが行えるようにすることです。 perlre/Extended Patterns を参照してください。
この変更は、文字列化された正規表現を ?-xism
を含む固定文字列と
比較しているコードを壊しそうです。
/d
, /l
, /u
, /a
修飾子四つの新しい正規表現修飾子が追加されました。 これらは互いに排他です: 同時には一つだけをオンにできます。
/l
修飾子は、use locale
スコープ内でない場合でも use locale
スコープ内であるかのように正規表現をコンパイルします。
/u
修飾子は、use feature 'unicode_strings'
プラグマのスコープ内に
あるかのように正規表現をコンパイルします。
(デフォルトの) /d
修飾子は、正規表現のコンパイル時に効果のある
全ての use locale
プラグマと use feature 'unicode_strings'
プラグマを
上書きするために使われます。
/a
正規表現修飾子は \s
, \d
, \w
および
POSIX ([[:posix:]]
) 文字クラスを ASCII の範囲に制限します。
それぞれの逆の効果を持つものと、\b
および \B
も同様に影響します。
その他では、/a
は /u
修飾子と同様に振る舞うので、大文字小文字を
無視するマッチングは Unicode の意味論を使います。
/a
修飾子が繰り返されると、さらに、大文字小文字を無視するマッチングでは
ASCII 文字でないものはマッチングしません。
例えば、
"k" =~ /\N{KELVIN SIGN}/ai "\xDF" =~ /ss/ai
はマッチングしますが
"k" =~ /\N{KELVIN SIGN}/aai "\xDF" =~ /ss/aai
はマッチングしません。
さらなる詳細については perlre/Modifiers を参照してください。
置換 (s///
) と変換 (y///
) 演算子は、入力変数をコピーしてから
置換を行い、結果を返す /r
オプションに対応しました。
元データは変更されないままです。
my $old = "cat"; my $new = $old =~ s/cat/dog/r; # $old is "cat" and $new is "dog"
これは特に map
で有用です。
さらなる例については perlop を参照してください。
正規表現の中で (?{...})
と (??{...})
コードブロックで
安全に正規表現を使えるようになりました。
しかし、これらのブロックはまだ実験的で、レキシカル (my
) 変数では
まだ問題があり、異常終了します。
use re '/flags'
re
プラグマは、レキシカルスコープの終わりまで正規表現フラグを
有効にする機能をもつようになりました:
use re "/x"; "foo" =~ / (.+) /; # /x implied
詳しくは re/"'/flags' mode" を参照してください。
ダブルクォート風コンテキストで使える、新しい 8 進エスケープシーケンス
"\o"
が導入されました。
この構造により、現在の最大である 0777 を超える 8 進数を使えるように
なります。
また、安全に他の正規表現と結合でき、正規表現捕捉グループと混乱することなく、
8 進数で文字を指定できるようになりました。
perlre/Capture groups を参照してください。
\p{Title}
の同義語としての \p{Titlecase}
この同義語は、Unicode 特性名である \p{Uppercase}
および
\p{Lowercase}
との対称性のために追加されました。
(use re 'debug'
で有効になる) 正規表現デバッグ表示は、
非 ASCII 文字をエスケープするときに 8 進数ではなく 16 進数を
使うようになりました。
delete $+{...}
の返り値カスタム正規表現エンジンは %+
や %-
の配列に対する delete
の
返り値を判定するようになりました。
警告: この機能は実験的と考えられているので、正確な振る舞いは将来の バージョンの Perl では変わるかもしれません。
配列やハッシュのコンテナを直接操作する全ての組み込み関数は bless されていない配列やハッシュのハードリファレンスも 受け付けるようになりました。
|----------------------------+---------------------------| | 伝統的文法 | 簡潔文法 | |----------------------------+---------------------------| | push @$arrayref, @stuff | push $arrayref, @stuff | | unshift @$arrayref, @stuff | unshift $arrayref, @stuff | | pop @$arrayref | pop $arrayref | | shift @$arrayref | shift $arrayref | | splice @$arrayref, 0, 2 | splice $arrayref, 0, 2 | | keys %$hashref | keys $hashref | | keys @$arrayref | keys $arrayref | | values %$hashref | values $hashref | | values @$arrayref | values $arrayref | | ($k,$v) = each %$hashref | ($k,$v) = each $hashref | | ($k,$v) = each @$arrayref | ($k,$v) = each $arrayref | |----------------------------+---------------------------|
これにより、これらの組み込み関数は、長いデリファレンスチェーンや
サブルーチンの返り値を@{}
や %{}
で囲む必要がなくなりました:
push @{$obj->tags}, $new_tag; # old way push $obj->tags, $new_tag; # new way
for ( keys %{$hoh->{genres}{artists}} ) {...} # old way for ( keys $hoh->{genres}{artists} ) {...} # new way
+
プロトタイプは $
の特殊な代替物で、リテラルな配列やハッシュ変数が
与えられたときには \[@%]
のように働きますが、その他の場合では
引数にスカラコンテキストを強制します。
perlsub/Prototypes を参照してください。
package
ブロック文法パッケージ宣言にコードブロックを含むことができるようになりました;
ただし宣言のスコープがそのブロックの内側だけの場合です。
従って、package Foo { ... }
は正確に { package Foo; ... }
と同じです。
これはまた、もっとも魅力のある機能である package Foo 1.2 { ... }
のように
宣言でのバージョン番号でも動作します。
perlfunc を参照してください。
文ラベルは package
など、あらゆる種類の文や宣言の前に
置けるようになりました。
一つの文の前に複数の文ラベルを置けるようになりました。
リテラルは、以前から対応していた 0x...
および 0b...
の接頭辞に
加えて、大文字の 0X...
および 0B...
も使えるようになりました
[perl #76296]。
C, Ruby, Python, PHP はすでにこの文法に対応していて、Perl でも内部的に
より一貫性があるようになりました:
eval sprintf "%#X", 0x10
という往復は、
eval sprintf "%#x", 0x10
と同様に 16
を返します。
tie
, tied
, untie
はオーバーライド可能になりました [perl #75902]。
信頼性と一貫性の向上のために、die
, warn
, $@
の振る舞いが
いくつか変更されました。
eval
の中で例外が投げられたとき、例外が実行中のデストラクタコードの
巻き戻しで上書きされる可能性がなくなりました。
以前は、例外は例外処理の始めの方で $@
に書き込まれていて、もし
eval
が解放されるオブジェクトのデストラクタとして内部的に
使われているときに外側の eval
から終了しようとしている場合、
上書きされていました。
今では例外は外側の eval
を抜ける前の最後の作業として $@
に
書き込まれるので、直後に実行されるコードはその eval
に対応する
$@
の値を正しく利用できます。
(デストラクタがこれに依存しているかも知れないので、$@
は eval
を
抜ける前にも設定されます。)
同様に eval
の中の local $@
はスコープ内の例外を上書きすることは
なくなりました。
以前は、巻き戻しによる $@
の復元によって、投げられた例外が
上書きされることがありました。
今では例外はとにかく eval
に渡されます。
そのため、die
の前の local $@
は安全です。
オブジェクトのデストラクタから投げられた例外は周りのコンテキストの
$@
を変更しなくなりました。
(もし周りのコンテキストが例外の巻き戻しなら、これは投げられた例外が
上書きされるもう一つの場合でした。)
以前はこのような例外は時々例外を出力して、
(周りの $@
が文字列かオブジェクトかに依存して)周りの $@
に
文字列を追加したり、周りの $@
を完全に書き換えたりしていました。
今ではこのような状況での例外は常に警告を出力して、周りの $@
は
無変更のままになります。
オブジェクトのデストラクタに加えて、これは G_KEEPERR
フラグを使った
XS コードによって実行される関数呼び出しにも影響を与えます。
die
の例外と同じ方法で、warn
の警告もオブジェクトになりました。
オブジェクトベースの警告が(標準エラーへの書き込みという)デフォルトの扱いを
受けると、今まで通り文字列化され、ファイル名と行番号が現れます。
しかし $SIG{__WARN__}
ハンドラは以前はオブジェクトを文字列化した
結果を受けとっていましたが、オブジェクトとしてオブジェクトベースの
警告を受けとるようになります。
$0
への代入は Linux では prctl()
を使って伝統的なプロセス名を設定しますLinux では、伝統的なプロセス名は、perl が バージョン 4.000 から行っている
argv[0]
経由で POSIX 名を置き換えることに加えて、prctl(2) を使って
設定されます。
ps, top, killall のような伝統的なプロセス名を読み込むシステム
ユーティリティは $0
へ代入することで設定した名前を
認識するようになります。
文字列は 16 バイトで切り詰められます; これは Linux による制限です。
srand()
は種を返すようになりましたこれにより、再現性のある結果が必要なプログラムが独自の種生成機構を使う 必要がなくなります。 代わりに、srand() を使って、返り値を将来の利用のために 保管しておいてください。 一つの例としては実行毎に網羅的にテストを行うには組み合わせが多すぎる テストプログラムです。 毎回ランダムな部分集合をテストして、もし失敗したら、その時の種を ログに記録することで同じ結果を生成するために使えます。
Perl の演算子 printf と sprintf、および Perl の内部の printf 代替
関数は、C90 サイズ修飾子である "hh" (char
), "z"
(size_t
), "t" (ptrdiff_t
) を認識するようになりました。
また、C99 コンパイラでコンパイルした場合、Perl はサイズ修飾子
"j" (intmax_t
) を認識するようになりました(しかしこれは
互換性がありません)。
それで、例えば、最近のマシンなら、sprintf('%hhd', 257)
は "1" を
返します。
${^GLOBAL_PHASE}
新しいグローバル変数 ${^GLOBAL_PHASE}
が追加され、Perl インタプリタの
現在のフェーズの内部状態がわかるようになりました。
これは perlvar/"${^GLOBAL_PHASE}" と
perlmod/"BEGIN, UNITCHECK, CHECK, INIT and END" で
詳しく説明されています。
-d:-foo
は Devel::foo::unimport
を呼び出しますThe syntax -d:foo was extended in 5.6.1 to make -d:foo=bar
equivalent to -MDevel::foo=bar, which expands
internally to use Devel::foo 'bar'
.
Perl は、モジュール名の接頭辞に -
を使えるようになりました;
これは -M と同じ意味論です; すなわち
-d:-foo
-M-Devel::foo と等価で、no Devel::foo;
に拡張され、もし
メソッドがあるなら Devel::foo->unimport()
を呼び出します。
-d:-foo=bar
-M-Devel::foo=bar と等価で、no Devel::foo 'bar';
に拡張され、
もしメソッドがあるなら Devel::foo->unimport('bar')
を呼び出します。
これは、Devel::*
モジュールの import
メソッドのデフォルトのアクションを
抑制する一方、デバッグのために読み込みたい場合に特に有用です。
ファイルハンドルへのメソッド呼び出しが、メソッドが解決できないために
die し、IO::File が読み込まれていない場合、Perl は require
経由で
IO::File を読み込んで、もう一度メソッド解決を試みます:
open my $fh, ">", $file; $fh->binmode(":raw"); # loads IO::File and succeeds
これはまた、STDOUT
, STDERR
, STDIN
のようなグロブに対しても
動作します:
STDOUT->autoflush(1);
このオンデマンドの読み込みはメソッド解決が失敗したときにのみ発生するので、 部分的なメソッド対応のために IO::File 親クラスを手動で読み込むという 伝統的な手法も予想通り動作します:
use IO::Handle; open my $fh, ">", $file; $fh->autoflush(1); # IO::File not loaded
Socket
モジュールは IPv6 に関する新しい情報を提供します;
Socket::getaddrinfo()
関数と Socket::getnameinfo()
関数の実装、
関連する定数、便利な新しい関数などです。
Socket を参照してください。
DTrace
プローブは追加の引数 arg3
を含むようになりました; これは
出入りすることでコンパイルされたパッケージを含んでいます。
例えば、以下の DTrace スクリプトを使って:
perl$target:::sub-entry { printf("%s::%s\n", copyinstr(arg0), copyinstr(arg3)); }
実行すると:
$ perl -e 'sub test { }; test'
DTrace
は以下のように表示します:
main::test
内部の変更 を参照してください。
perlunicode/"User-Defined Character Properties" で、"In" または "Is" で
始まる名前のサブルーチンを定義することでカスタム特性を作ることができると
文書化されています。
しかし、Perl は実際にはこの命名の制限は実行しておらず、
\p{foo::bar}
が foo::bar() を(存在していれば) 呼び出していました。
文書化された規約は実行されるようになりました。
また、Perl はユーザー定義特性を起動するのに汚染された正規表現を 使わなくなりました。 代わりに単に die します [perl #82616]。
Perl 5.14.0 は以前の安定リリースとバイナリ互換性はありません。
以下の章に加えて、C API の変更 を参照してください。
いくつかの文字は、Unicode ルールでの /i
正規表現マッチングでは
2 または 3 文字の並びにマッチングします。
一つの例としては、LATIN SMALL LETTER SHARP S
は ss
という並びに
マッチングします。
'ss' =~ /\A[\N{LATIN SMALL LETTER SHARP S}]\z/i # Matches
しかしこれは、特に反転させたときに、とても非直観的な結果を導いていました。
これにより、Perl 5.14 は反転させた文字クラスでの複数文字の
/i
マッチングを使わなくなりました。
'ss' =~ /\A[^\N{LATIN SMALL LETTER SHARP S}]+\z/i # ???
これは、SHARP S
や、/i
の元で SHARP S
にマッチングしないあらゆる
文字の並びにマッチングするべきです。
"s"
は SHARP S
ではありませんが、Unicode は /i
の元では "ss"
は
SHARP S
にマッチングするとしています。
そこで、どちらが「勝つ」べきでしょうか?
文字列に ss
があるという理由でマッチングは失敗するでしょうか、それとも
一つの s
に匹津津井で一つの s
があるので成功するでしょうか?
Perl の以前のリリースは複数文字のマッチングを許していましたが、バグにより、 ほとんど動作していませんでした。
ある種の環境では、正規表現中での \400
-\777
の使用は、
その他の全てのダブルクォート風コンテキストでの使用と異なっていました。
5.10.1 から、Perl はこれが起きたときには非推奨警告メッセージを
出力していました。
今では、これらのリテラルは全てダブルクォート風コンテキストと同じ
振る舞いをするようになりました; つまり、\x{100}
-\x{1FF}
と等価で、
非推奨警告も出ません。
\400
-\777
のコマンドラインオプションでの使用 -0 は、
慣習的な今の意味のままです。
これは入力ファイル全体を読み込みます; 以前は、これは -0777 とだけ
文書化されていました。
様々なあいまいさがあるので、8 進数で文字を表現する場合は
新しい \o{...}
構文を使うべきです。
\p{}
特性は大文字小文字なしのマッチングから免除されるようになりましたほとんどの Unicode 特性について、/i
大文字小文字無視オプションの
ありなしでマッチングが変わるというのは意味がありません。
このことで予想外の結果と潜在的なセキュリティーホールを導きます。
例えば
m/\p{ASCII_Hex_Digit}+/i
これは以前は Unicode マッチングルールによって(これに関するいくつかのバグが
ありましたが)非 ASCII 文字にマッチングします。
今では /i
の下では、人々が違いを心に浮かべるようないくつかの
特性(特に m/\p{Uppercase}/i
and m/\p{Lowercase}/i
(どちらも
m/\p{Cased}/i
でマッチングする符号位置と同じものにマッチングします)
のような、意味的に大文字小文字が不可欠な部分を占めるような名前のもの)を除いて、
非 /i
マッチングと同じ結果となります。
詳細は perlrecharclass/Unicode Properties にあります。
/i
によってマッチングの結果を変える必要があるユーザー定義特性ハンドラは、
大文字小文字を無視するマッチングが有効の時には非 0、そうでない場合は 0 を
取る、新しく渡される真偽値パラメータを読むように変更しなければなりません。
perlunicode/User-Defined Character Properties を参照してください。
パターン中に指定された Unicode 特性マッチングは、\N{NAME}
と同様、この
パターンは Unicode ルールに従ってマッチングすることを
意味しているということを示すようになりました。
use locale
が有効な状態でコンパイルされた正規表現は、use locale
の
外側でコンパイルされた新しい正規表現に展開されたときも有効のままになります
(また逆も成り立ちます)。
以前は、他の正規表現に展開された正規表現はその時点でのロケール状態を 継承し、最初に持っていたロケール状態を失っていました。 これはバグ修正と考えられていますが、この正しくない振る舞いに依存していた コードをつまずかせるかもしれません。
デフォルトの正規表現修飾子は (?^...)
を使って
記録されるようになりました。
古い文字列化に依存しているコードは動きません。
これは、文字列化は自動的に新しい修飾子に組み込まれるので、
これが起きる度に変更し続ける必要をなくすためです。
旧方式と新方式の正規表現の両方で正しく動作する必要のあるコードでは、 (perl 5.9.5 以降では; re 参照) 以下のものを使って問題全体を 回避できます:
use re qw(regexp_pattern); my ($pat, $mods) = regexp_pattern($re_ref);
もし実際の文字列化が重要であるか、より古い Perl に対応する必要が ある場合は、以下のような方法が使えます:
# Accept both old and new-style stringification my $modifiers = (qr/foobar/ =~ /\Q(?^/) ? "^" : "-xism";
それから -xism
のかわりに $modifiers
を使います。
正規表現中のコードブロック ((?{...})
と (??{...})
) は、
以前は正規表現が実行中に以下の二つのような状態になった場合に全ての
プラグマ(strict, warnings など) が継承されていませんでした:
use re "eval"; $foo =~ $bar; # when $bar contains (?{...}) $foo =~ /$bar(?{ $finished = 1 })/;
このバグは修正されましたが、 このバグっぽい振る舞いに依存しているコードは正しい振る舞いに 対応するように修正する必要があるかも知れません。
以下のような場合:
tie @a, ...; { local @a; # here, @a is a now a new, untied array } # here, @a refers again to the old, tied array
以前のバージョンの Perl では間違って新しいローカルな配列を tie していました。 これは修正されました。 しかしこの修正によってコードの振る舞いの変化を引き起こすかも知れません。
defined %Foo::
は、例えこのパッケージでまだ何のシンボルも
定義されていなくても、常に真を返します。
これは、5.10.0 で追加された、ハッシュの内部ストレージの変更の副作用を 隠すためのトークナイザの特別な場合のその場しのぎの副作用です。 この修正はハッシュのメモリオーバーヘッドを劇的に減少させます。
スタッシュに対して defined を呼び出すことは 5.6.0 から非推奨になり、
レキシカルでは 5.6.0 から警告が出力され、スタッシュとその他の
パッケージ変数に対しては 5.12.0 から警告を出していました。
defined %hash
は常に実装の詳細を露出させていました:
全てのエントリを削除することでハッシュを空にしても
defined %hash
は偽になりませんでした。
従って、defined %hash
は、任意のハッシュが空かどうかを判定するには
不正なコードです。
代わりに、空の %hash
はスカラコンテキストでは常に偽を返すという
振る舞いを使ってください。
スタッシュリスト代入 %foo:: = ()
は、一時的に無名の空のスタッシュを
作っていました。
その結果、どこかでリファレンスされているサブルーチンも無名になり、
caller
では "(unknown)" になります。
今ではパッケージ名を保持するようになったので、caller
は型グロブへの
リファレンスがあれば元のサブルーチン名を、さもなければ
"foo::__ANON__" を返します [perl #79208]。
型グロブをスカラ変数に代入すると:
$glob = *foo;
$glob
にコピーされたグロブは、このグロブが単なるコピーであることを
示す特別なフラグが付けられます。
これにより、引き続く $glob
への代入によってグロブを上書きできます。
しかし、元のグロブは変更されません。
一部の Perl 演算子はこの2種類のグロブを区別していませんでした。
これにより、エッジケースでは不思議な振る舞いを見せていました:
untie $scalar
は、最後に代入されたものがグロブの場合はスカラを
untie しませんでした (なぜならこれはハンドルを untie する
untie *$scalar
として扱われるからです)。
(*$glob = \@some_array
のような) グロブスロットへの代入は単に
\@some_array
を $glob
に代入します。
これを修正するために、*{}
演算子 (*foo
と *$foo
の
形式を含みます) は、もしオペランドがグロブのコピーなら新しい変更不能の
グロブを作るように修正されました。
これにより、演算子がグロブとスカラを修正するときの区別は、変更不能のグロブを
グロブとして扱うだけになりました。
(tie
, tied
, untie
は、互換性の理由によりそのまま残されましたが、
警告が出ます。
非推奨 を参照してください。)
これは、演算子がグロブのコピーを渡すときに *{}
の返り値をグロブに
代入するコードでは非互換の変更になります。
例えば、以下のようなコードの場合:
$glob = *foo; *$glob = *bar;
2 行目の *$glob
は新しい変更不能のグロブを返します。
新しいグロブは *bar
への別名として作られます。
それからこれは捨てられます。
従って、2 行目の代入では何も起こりません。
さらなる詳細については http://rt.perl.org/rt3/Public/Bug/Display.html を 参照してください。
Perl の以前のバージョンでは、 $!
, %SIG
などのようなマジカル変数は
他のパッケージへ「漏洩」していました。
それで %foo::SIG
がシグナルのアクセスに使えたり、
(strict モードがオフなら) ${"foo::!"}
(with strict mode off) が
C の errno
へのアクセスに使えたり、などです。
これはバグ、あるいは「想定外の」機能でした; これにより、モジュールが 読み込まれるときにシグナルハンドラがクリアされるといったさまざまな 悪影響を引き起こしていました。
これは修正されました (あるいは見方によっては、この機能は取り除かれました)。
local($_)
は $_ から全てのマジカルな機能を取り去りますスカラ変数に local()
を行うと新しい値が与えられますが、全てのマジカルな
機能はそのままでした。
perlsub はデフォルトスカラ変数 $_ に代入する全てのサブルーチンはまず
ローカル化することを勧めていますが、$_ に対しては問題があることが
判明しています。
これにより、もし $_ が読み込み専用変数の別名となっていると例外が
投げられ、一般的には様々な想定外の副作用があります。
従って、一般的なルールへの例外として、local($_)は $_ に新しい値を 代入するだけでなく、全てのマジカルな機能が取り除かれるようになりました。
パッケージ名とパッケージ変数のパースが変わりました:
foo::::bar
のような連続するコロンの組は、全てパッケージセパレータとして
扱われます。
この変更に関係なく、パッケージセパレータの正確なパースは保証されず、 将来のバージョンの Perl では変更される可能性があります。
given
の返り値given
ブロックは最後に評価した式を返すようになりました
(ブロックが break
で終了した場合は空リストを返します)。
従って、以下のように書けるようになりました:
my $type = do { given ($num) { break when undef; "integer" when /^[+-]?[0-9]+$/; "float" when /^[+-]?[0-9]+(?:\.[0-9]+)?$/; "unknown"; } };
詳しくは perlsyn/Return value を参照してください。
以下のプロトタイプで宣言された関数は、正しく単項関数として 振る舞うようになりました:
* \$ \% \@ \* \& \[...] ;$ ;* ;\$ ;\% etc. ;\[...]
このバグ修正 [perl #75904] により、(*)
, (;$)
, (;*)
プロトタイプを
使った関数は以前より高い優先順位でパースされます。
従って、以下のようなコードは:
sub foo(;$); foo $a < $b;
2 行目は foo($a < $b)
ではなく、正しく foo($a) < $b
と
パースされます。
これはかっこなしの引数で以下の演算子のいずれかが使われたときに起こります:
< > <= >= lt gt le ge == != <=> eq ne cmp ~~ & | ^ && || // .. ... ?: = += -= *= etc. , =>
以前は、以下のコードはマッチングに成功していました:
my @a = qw(a y0 z); my @b = qw(a x0 z); @a[0 .. $#b] ~~ @b;
このおかしな振る舞いは修正されました [perl #77468]。
単項否定演算子 -
は数値のように見える文字列を数値として扱うように
なりました [perl #57706]。
負数のゼロ (-0.0) は、文字列に変換したとき、どのプラットフォームでも "0" になるようになりました。 以前はプラットフォームによって "-0" だったり "0" だったりしていました。
未だにゼロが負数かどうかを決定したい場合は、
sprintf("%g", $zero) =~ /^-/
とするか、CPAN にある
Data::Float モジュールを使ってください。
:=
は文法エラーになりました今までは、my $pi := 4
は正確に my $pi : = 4
と等価でした;
:
で属性リストが開始し、=
の前で終了していると扱われていました。
: =
の意味となる :=
の使い方は 5.12.0 では非推奨となり、
今回文法エラーとなりました。
これにより、将来 :=
を新しいトークンとして使えるようになります。
これのためのコアのテスト以外、CPAN にこの構造を使っている Perl 5 の コードはありませんでした。 実際の世界のコードベースではほとんど影響を与えないと信じています。
(例えば、コードジェネレータのために) 空の要素リストがどうしても必要な場合は、
単に =
の前に空白を追加することでエラーを回避してください。
Unicode の "XIDStart" 集合外の文字は識別子の先頭としてはもはや 許されなくなりました。 これは、普通は英文字に引き続くある種のアクセントやマークはもはや 識別子の最初の文字にはならないことを意味します。
Windows 以外で fchdir
関数のないシステムでは、新しく作られたスレッドが
親スレッドからディレクトリハンドルを継承しなくなりました。
このようなプログラムはどちらにしろ普通はクラッシュします[perl #75154]。
close
デッドロックを避けるために、close
関数は、もし基となるファイル記述子が
他のスレッドで使われている場合は、子プロセスの終了を待たなくなりました。
このような場合は真を返します。
fork()
エミュレーションはシグナルを送られた子プロセスを待ちませんWindows では、親プロセスはフォークした子プロセスが全て終了するまで
終了しません。
しかし、kill("KILL", ...)
は本質的に疑似プロセスにとっては不安定で、
kill("TERM", ...)
は、子プロセスがシステムコールでブロックしているときは
配達されないかもしれません。
デッドロックを避けつつ、ホスティングプロセスを終了するための安全な
機構を提供するために、SIGTERM シグナルを送られた子プロセスを
待たなくなりました。
これは、子プロセスの後片付け処理が終了できるようにしなければならない
場合にこれらの子プロセスに waitpid()
をする親プロセス次第です。
しかし、子プロセスが I/O をブロックできないことを確実にすることで
デッドロックを避けるために親が責任を持ちます。
Windows での fork()
エミュレーションに関するさらなる情報については
perlfork を参照してください。
Policy_sh.SH での、いくつの長年のタイプミスと命名の混乱が修正され、 config.sh で使われる変数名が正規化されました。
これは、この間違ったふるまいに偶然依存している場合の Policy.sh の 振る舞いが変更されます。
Perl スクリプトは、Windows では ByteLoader モジュール (もはや
コア Perl の一部ではありません) のメリットを使うためにバイナリモードで
読み込まれていました。
これは、DATA
ファイルハンドルに対する seek()/tell() および
単に system()
, 逆クォート, fork()
などの呼び出しによってファイルハンドルが
フラッシュした後に DATA
からの読み込みを含む様々な操作を
壊すという副作用がありました。
Windows でのデフォルトのビルドオプションは、Windows では Perl の ソースコードをテキストモードで読み込むように変更されました。 ByteLoader が(出来れば)この状況を自動的に扱えるように CPAN で更新されます [perl #28106]。
非推奨の C API も参照してください。
正規表現演算子やその修飾子と、引き続く単語の間の空白を省略することは
非推奨となりました。
例えば、m/foo/sand $bar
はまだ m/foo/s and $bar
と
パースされますが、警告が出ます。
\cX
バックスラッシュ-c 構造は表示できない文字を指定する方法として
設計されましたが、(ASCII プラットフォームでは) c
に引き続く文字に
制限はありませんでした。
この文字が ASCII 文字でない場合は非推奨警告が出るようになりました。
また、"\c{"
(これは単に ";"
と書くのと同じです) でも非推奨警告が出ます。
"\b{"
と "\B{"
正規表現において、リテラルの "{"
の(大かっこの文字クラスの中でなく)直後に
"\b"
や "\B{"
を続けることは、Perl 自身が将来使えるようにするために、
非推奨となりました。
Perl は Perl 5 より前のライブラリファイルを少量同梱しています。 同梱ファイルのほとんどは(今では CPAN から利用可能ですが) 非推奨となりました。 影響を受けるファイルは、コアの一部としてインストールされている場合は 実行時に警告が出るようになりました。
これは -X やレキシカルな警告ビットに従うのではなく、強制的な警告です。 この警告は、コアで非推奨となった .pm ライブラリのための deprecate.pm によって供給されます。 これは .pl ライブラリを含んでいる特定の CPAN 配布を示しています。 もちろん、CPAN 版は警告は出ません。
$[
へのリスト代入$[
への代入は Perl バージョン 5.12.0 から非推奨となり、警告が出ます。
このバージョン (5.14) の Perl はまた、リストコンテキストでの $[
への代入も
警告を出すようになりました。
これは 5.12.0 での見落としを修正します。
歴史的に、パーサは qw(...)
リテラルは常にかっこに囲まれていると考えるように
自分をだましていて、結果として、時々それらの周りのかっこを省略できました:
for $x qw(a b c) { ... }
パーサはもはや自分自身をこの方法でだましません。 以下のように、リストリテラルをかっこで囲んでください:
for $x (qw(a b c)) { ... }
これは、for $i (1,2,3) { ... }
のかっこは式の文法の一部ではないので、
非推奨となりました。
これは文の文法の一部で、for
文はリテラルなかっこが必要です。
qw
式が要求する合成されたかっこは、式文法の一部として扱うことを
対象としているだけです。
これは以下のような場合の振る舞いは変更しないことに注意してください:
use POSIX qw(setlocale localeconv); our @EXPORT = qw(foo bar baz);
ここでは式の回りにかっこは不要です。
\N{BELL}
これは、Unicode がこの名前を違う文字に使っているからです。 さらなる説明については Unicode Version 6.0 に (ほぼ) 対応しました を 参照してください。
?PATTERN?
(最初の m
のない) ?PATTERN?
は非推奨となり、警告を出すようになりました。
これは、将来 ?
を新しい演算子として使えるようにするためです。
一度だけマッチングする機能は今でも m?PATTERN?
として利用可能です。
tie 関数 (tie
, tied
, untie
) をスカラ引数で呼び出すと、
もしそのスカラがたまたま型グロブを保持していた場合はファイルハンドルに対して
動作します。
これは Perl 5.16 で削除される予定の長年のバグです; 型グロブを保持している スカラ自身を tie する方法がなく、型グロブを代入されたスカラを untie する方法もないからです。
tie 関数が明示的な *
なしにハンドルに対して使われると、非推奨警告が
出るようになりました。
この機能は perlunicode/User-Defined Case Mappings (for serious hackers only) に 文書化されているように多くの問題を抱えているので、非推奨となりました。 この機能は Perl 5.16 で削除されます。 代わりに、改良された機能を提供する、CPAN モジュール Unicode::Casing を 使ってください。
以下のモジュールは将来のリリースではコア配布からは取り除かれ、 代わりに CPAN からインストールするようになります。 CPAN での配布物のでこのモジュールが必要な場合は、事前条件に追加する 必要があります。 これらのモジュールのコア版は、非推奨警告を発生させます。
単独、あるいはより大きいシステムの一部として、パッケージ版の Perl を
出荷する場合、非推奨のコアモジュールの影響を注意深く検討するべきです。
非推奨モジュールを perl ライブラリディレクトリ
vendor
か site
にインストールして Perl のデフォルトビルドを
出荷したいかもしれません。
これは非推奨警告を抑制します。
あるいは、lib/deprecate.pm にパッチを当てて、 あなたのパッケージシステムや配布が、単一のパッケージのインストールがある 機能を提供するリリースから、同じ機能を得るために複数のパッケージを インストールすることをシステム管理者が知る必要があるより新しいリリースへの 段階的な移行する方法と一貫した、あなたのパッケージシステムや Perl の配布に固有の警告メッセージを提供したいかもしれません。
モジュールを CPAN からインストールすることによって、非推奨警告を
消すことができます。
これら全ての最新版をインストールするには、単に
Task::Deprecations::5_14
をインストールしてください。
Devel::Dprof の代わりに Devel::NYTProf をインストールして使うことを 強く推奨します; Devel::NYTProf は著しく改良されたプロファイリングと報告を提供します。
シグナル発行は実行ループから制御 op に移動しました。 これにより、速度が数 % 向上し、5.8.0 で導入された「安全なシグナル」による 速度の低下のほとんど全てを取り除けているはずです。 シグナルは以前と同じように、同じ文の中で発行されます。 もしこれが 起こらない か、あるいはもし中断不能なループが作成できることを 発見したなら、それはバグです; 問題を再現する方法を報告してください。
shift()
と pop()
の最適化引数なしの (@_
が使われる) shift()
と pop()
の呼び出しでは使われる
op が二つ少なくなりました。
この変更により、shift @_
と比べて shift()
はスレッドなし perl で
5%、スレッド化 perl で 25 % 速くなります。
(正規表現エンジンによって激しく利用される)大文字小文字を無視した文字列
比較を行う foldEQ_utf8
API 関数は大幅にリファクタリングされ
最適化されました - そしておまけとしてドキュメントが大幅に向上しました。
正規表現を utf8 に昇格する必要があるけれどもコンパイル開始時には 分かっていなかった場合の正規表現のコンパイルが高速化されました。
多くの文字列追加を行うとき、システムの malloc
実装を使うように
ビルドされている perl は、最終的に必要な分よりもとても
多くのメモリを非効率な方法で割り当ててしまうことがありました。
文字列を追加するときにもし必要ならより多くのメモリを割り当てていた
sv_grow
関数は、ある種の等比級数に切り上げたメモリを伝えるようになり、
特定のプラットフォームと設定ではとても早くなりました。
Win32 では、これは約 100 倍高速です。
PL_*
アクセサ関数の削除MULTIPLICITY
が最初に開発され、インタプリタの状態が
interpreter 構造体に
移動したとき、スレッドとインタプリタローカルな PL_*
変数は、
アクセサ関数を呼び出して perl コアの外側のアドレスを返すマクロとして
定義されていました。
この目的は、バイナリ互換性を壊すことなく interpreter 構造体にある
メンバのサイズを変えられるようにすることでした;
それでバグ修正はそのようなサイズ変更が必要なメンテナンスブランチに
マージできるようになっていました。
この機構は冗長であり、正しい振る舞いをするコードがこれによって
ペナルティを受けていました。
これは削除されました。
あるオブジェクトに多くの弱い参照があると、そのオブジェクトを解放するときに 状況によっては O(N&0xB2;) (N は参照の数) の時間がかかることが ありました。 そうなる状況の数は減少しました [perl #75254]。
my @array = ...
と my %hash = ...
の代入を高速化するために
以前行われた最適化はバグを引き起こしていたので Perl 5.12.0 で
無効化されました。
このような代入を高速化する新しい方法が発見されました [perl #82110]。
@_
のメモリ消費が減りました以前は、@_
の割り当ては四つのエントリに十分なスペースで全ての
サブルーチンに対してコンパイル時に行われていました。
この割り当てはサブルーチンが呼び出されるときにオンデマンドで
行われるようになりました [perl #72416]。
xhv_fill
は struct xpvhv
から削除され、ハッシュ毎に 1 IV 節約される
ことにより、システムによっては struct xpvhv
がキャッシュ境界に
一致するようになりました。
このメモリ節約が他の場所での低速化を引き起こすことを避けるために、
HvFILL
の真偽値での使用は代わりに (等価である) HvTOTALKEYS
を
使うようになりました; それで実際に必要なときに埋められるデータは
オンデマンドで計算されるようになりましたが、これが必要になるような状況は
稀なはずです。
SV ボディの構造体要素の順番が変更されました。 事実上は、NV スロットが STASH および MAGIC の位置と交換されました。 SV メンバへの全てのアクセスはマクロ経由なので、これは完全に透過的です。 この変更により、上述した PVHV のスペース節約が可能になり、 アーキテクチャによっては PVIV に必要なメモリ割り当てが減少します。
XPV
, XPVIV
, XPVNV
は実際に使用される SV
ボディの一部としてのみ
割り当てられるようになり、スペースが節約されます。
正規表現を含むスカラは実際に使用される SV
ボディの一部としてのみ
割り当てられるようになり、スペースが節約されます。
@EXPORT_FAIL
AV は必要になるまで作成されなくなり、従ってどちらもそれに
もどる型グロブではありません。
これにより、Exporter を使うけれどもこの機能を使わないパッケージ毎に
200 バイトほど節約できます。
弱い参照については、参照先毎に一つだけの弱い参照というよくあるケースでは 必要なメモリを減らすように最適化されました。 この場合、参照先毎に等価な一つの小さな Perl 配列を節約できます。
%+
と %-
のメモリ消費が減りましたTie::Hash::NamedCapture
モジュールの塊が Perl コアで使われていました。
これは XS モジュールに移動し、%+
や %-
を使わないプログラムのための
オーバーヘッドが減少しました。
スレッドのための内部構造体は API 呼び出しと割り当てが減少し、 結果としてオブジェクトコードが大幅に小さくなりました。 さらに、多くのスレッドコンテキストチェックは保留されていたので、 必要になったときにだけ行うようになりました(ただしこれはデバッグビルドでない 場合にのみ可能です)。
以前は、以下のようなコードは
use constant DEBUG => 0;
sub GAK { warn if DEBUG; print "stuff\n"; }
warn if DEBUG
のための op は null
op (ex-const
) に畳み込まれますが、
nextstate
op はそのまま残るので、実行時に
nextstate
, nextstate
といった op が発行されていました。
連続した nextstate
op の実行は単なる最後の nextstate
op の実行と
同じなので、覗き穴最適器は最初の nextstate
op の組を
削除するようになりました; 先頭がラベルの場合は例外です; なぜならラベルは
最適化器によって削除されてはならず、ラベルの利用法はコンパイル時には決定的には
分かっていないからです。
CPAN::Meta::YAML 0.003 が二重管理モジュールとして追加されました。 これは CPAN 配布に含まれていたり、モジュールインストールツールチェーンによって 生成される META.yml と MYMETA.yml のファイルを読み書きするのに 十分な、YAML のサブセットに対応しています。 その他の一般的な YAML のパースや生成のために使うべきではありません。
CPAN::Meta バージョン 2.110440 が二重管理モジュールとして追加されました。 これは、配布、内容、ビルドとインストールに必要なものを記述した (META.json や META.yml のような) CPAN 配布メタデータファイルを 読み込み、解釈、書き込みするための標準ライブラリを提供します。 最新の CPAN 配布メタデータ仕様は CPAN::Meta::Spec に含まれていて、 仕様の変更履歴は CPAN::Meta::History に記録されています。
HTTP::Tiny 0.012 が二重管理モジュールとして追加されました。 これは、単純な GET リクエストとファイルミラーのために設計された とても小さく単純な HTTP/1.1 クライアントです。 これは、CPAN.pm と CPANPLUS が curl(1) や wget(1) といった 外部バイナリに頼ることなくピュア Perl を使って CPAN への 「ブートストラップ」HTTP アクセスを可能にするために追加されました。
CPAN クライアントが CPAN 配布の META.json を読み込めるように、 JSON::PP 2.27105 が二重管理モジュールとして追加されました。
Module::Metadata 1.000004 が二重管理モジュールとして追加されました。 これは Perl のモジュールファイルからパッケージと POD の情報を集めます。 これは他のも寿ル乃インストールツールチェーンの要素として使うための、 Module::Build::ModuleInfo を基にした単独のモジュールです。 Module::Build::ModuleInfo は非推奨となり、代わりにこのモジュールを 使うべきです。
Perl::OSType 1.002 が二重管理モジュールとして追加されました。 これは ("dragonfly" や "MSWin32" のような) Perl の オペレーティングシステム名を、("Unix" や "Windows" のような)より一般的で 標準化された名前にマッピングします。 これは Module::Build と ExtUtils::CBuilder からリファクタリングされ、 このようなマッピングをより簡単に保守するために一つの場所に集約されました。
Unicode::Collate のアップグレードによって以下のモジュールが 追加されました。 詳しくは以下を参照してください。
Unicode::Collate::CJK::Big5
Unicode::Collate::CJK::GB2312
Unicode::Collate::CJK::JISX0208
Unicode::Collate::CJK::Korean
Unicode::Collate::CJK::Pinyin
Unicode::Collate::CJK::Stroke
Version::Requirements バージョン 0.101020 が二重管理モジュールとして 追加されました。 CPAN::Meta::Spec に定義されている前提条件とバージョン定数のモデルと 操作を標準ライブラリに提供します。
attributes はバージョン 0.12 から 0.14 に更新されました。
Archive::Extract はバージョン 0.38 から 0.48 に更新されました。
0.38 から更新されたものは: Archive::Extract を $\
の変更から守る、
安全な表示メソッド; コア Perl で実行されたときのテストの修正;
TZ ファイル対応; lzma のロジックに IO::Uncompress::Unlzma を使う修正;
NetBSD-current と新しい unzip(1) 実行ファイルに関する問題の修正。
Archive::Tar はバージョン 1.54 から 1.76 に更新されました。
1.54 からの重要な変更は以下の通りです:
tar(1) busybox 実装との互換性。
write()
と create_archive()
が自分自身で開いたファイルハンドルしか
閉じない問題の修正。
extract_archive の終了コードに関するバグが修正されました。
ptar(1) ユーティリティは、Windows で誰でも書き込み可能な ファイルなしに安全に tarball を作成できるようになり、これらの アーカイブを CPAN にアップロード出来るようになりました。
tar アーカイブ内のファイルの内容に対して正規表現を使う、新しい ptargrep(1) ユーティリティ。
Pax 拡張ヘッダが読み飛ばされるようになりました。
Attribute::Handlers はバージョン 0.87 から 0.89 に更新されました。
autodie はバージョン 2.06_01 から 2.1001 に更新されました。
AutoLoader はバージョン 5.70 から 5.71 に更新されました。
B はバージョン 1.23 から 1.29 に更新されました。
8 進数の範囲外の文字を含んでいるときや、use utf8
スコープで
コンパイルされた y///
で分解したときにクラッシュしなくなりました。
共有オブジェクトのサイズは、機能を減らすことなしにおよそ 40% 減少しました。
B::Concise はバージョン 0.78 から 0.83 に更新されました。
B::Concise は rv2sv(), rv2av(), rv2hv() op に対して新しいフラグ
OPpDEREF
フラグを "DREFed" に設定します。
-tree オプションで壊れた出力を出さなくなりました [perl #80632]。
B::Debug はバージョン 1.12 から 1.16 に更新されました。
B::Deparse はバージョン 0.96 から 1.03 に更新されました。
nextstate
op の逆パースは、以前の nextstate へのパッケージ相対への
変更か、%^H
あるいはその他の状態とラベルの変更で、変更されました。
以前はラベルは最初に出力されていましたが、最後に出力されるように
なりました (5.12.1)。
no 5.13.2
や同様の形式が B::Deparse で正しく
扱えるようになりました (5.12.3)。
B::Deparse は暗黙の $_
に対して条件付きパターンマッチングを適用する
コードを正しく扱えるようになりました; [perl #20444] で修正されました。
our
の後に (use utf8
プラグマの元で許されるような)変わった文字の
変数が続いたときの逆パースも修正されました [perl #33752]。
B::Lint はバージョン 1.11_01 から 1.13 に更新されました。
base はバージョン 2.15 から 2.16 に更新されました。
Benchmark はバージョン 1.11 から 1.12 に更新されました。
bignum はバージョン 0.23 から 0.27 に更新されました。
Carp はバージョン 1.15 から 1.20 に更新されました。
Carp は、不完全な caller() のオーバーライドを
検出して、偽の @DB::args
の使用を回避するようになりました。
バックトレースを提供するために、Carp は caller()
組み込み関数の
特定の振る舞いに依存しています。
Carp は、この関数が不完全な実装のコードでオーバーライドされていることを
検出して、そのバックトレースをそれに応じて修正します。
以前は、不完全なオーバーライドによってバックトレースの値が間違ったり(最良の
場合)、不明瞭な致命的エラーが発生したり(最悪の場合)していました。
これは、caller() を正しくオーバーライドしていないモジュールによって 引き起こされる "Bizarre copy of ARRAY" が起きる場合を 修正します (5.12.2)。
これは Perl による Unicode テーブルの読み込みを引き起こし、 文法エラーがあったときに "BEGIN not safe after errors" が起こることを引き起こす正規表現の使用を回避します [perl #82854]。
CGI はバージョン 3.48 から 3.52 に更新されました。
これは以下のセキュリティ修正を提供します: multipart_init()
の MIME 境界が
ランダムになり、ヘッダ値に含まれている改行の扱いが改良されました。
Compress::Raw::Bzip2 はバージョン 2.024 から 2.033 に更新されました。
bzip2(1) 1.0.6 を使うように更新されました。
Compress::Raw::Zlib はバージョン 2.024 から 2.033 に更新されました。
constant はバージョン 1.20 から 1.21 に更新されました。
再び Unicode 定数が動作するようになりました。 これは Perl 5.10.0 から壊れていました [CPAN RT #67525]。
CPAN はバージョン 1.94_56 から 1.9600 に更新されました。
主な注目点は:
CPANPLUS はバージョン 0.90 から 0.9103 に更新されました。
cpanp-run-perl の変更により、
[perl #55964] と
[perl #57106] が
解決します; どちらも Module::Install::DSL
を使ったインストールの
失敗に関係しています (5.12.2)。
Config の依存性はコアモジュールの依存性として認識されていませんでした。 これは修正されました。
CPANPLUS は META.json と MYMETA.json に対応するようになりました。
CPANPLUS::Dist::Build はバージョン 0.46 から 0.54 に更新されました。
Data::Dumper はバージョン 2.125 から 2.130_02 に更新されました。
$Data::Dumper::Terse
がセットされているときにインデントが
なくなっていました。
これは修正されました [perl #73604]。
この更新は、スタックが変わるようなカスタムソート関数を使ったときの クラッシュも修正しました [perl #74170]。
Dumpxs は *$io_ref
で返されたグロブでクラッシュしなくなりました
[perl #72332]。
DB_File はバージョン 1.820 から 1.821 に更新されました。
DBM_Filter はバージョン 0.03 から 0.04 に更新されました。
Devel::DProf はバージョン 20080331.00 から 20110228.00 に更新されました。
単に Devel::DProf を読み込んでも、もはやプロファイリング開始を
引き起こさなくなりました。
use Devel::DProf
と perl -d:DProf ...
は今まで通り振る舞い、
プロファイラを開始します。
注意: Devel::DProf は非推奨で、将来のバージョンの Perl で 削除されます。 代わりに Devel::NYTProf をインストールして使うことを強く勧めます; これは著しく改良されたプロファイリングと報告を提供します。
Devel::Peek はバージョン 1.04 から 1.07 に更新されました。
Devel::SelfStubber はバージョン 1.03 から 1.05 に更新されました。
diagnostics はバージョン 1.19 から 1.22 に更新されました。
POD リンクを少しよくレンダリングするようになり、他のメッセージと説明を 共有している説明を知らせるようになりました。
Digest::MD5 はバージョン 2.39 から 2.51 に更新されました。
このモジュールをスレッドとともに使っても安全になりました。
Digest::SHA はバージョン 5.47 から 5.61 に更新されました。
shasum はさらに sha1sum
/md5sum
を真似るようになりました。
Addfile は全ての POSIX ファイル名を受け付けます。
新しい SHA-512/224 と SHA-512/256 の変換 (参照: NIST Draft FIPS 180-4 [February 2011])
DirHandle はバージョン 1.03 から 1.04 に更新されました。
Dumpvalue はバージョン 1.13 から 1.16 に更新されました。
DynaLoader はバージョン 1.10 から 1.13 に更新されました。
とても長いファイル名を渡したときのバッファオーバーフローを修正しました。
AutoLoader から継承しなくなりました; これにより、DynaLoader から 継承するクラスのメソッド呼び出しに失敗したという奇妙なエラーメッセージは もはや出力されなくなりました [perl #84358]。
Encode はバージョン 2.39 から 2.42 に更新されました。
66 Unicode 非文字全ては U+FFFF と同じように扱われるようになりました: U+FFFF が不許可の場合は 66 全てが不許可となり、U+FFFF が警告を出す場合は 66 全てで警告を出します。
Env はバージョン 1.01 から 1.02 に更新されました。
Errno はバージョン 1.11 から 1.13 に更新されました。
Errno の実装がリファクタリングされ、メモリ消費が 55% 減りました。
mingw64
を使う Win32 gcc(1) のように、変わったヘッダファイルを
使うプラットフォームで、実際にはエラー番号ではない定数がErrno によって
露出していました。
これは修正されました [perl #77416]。
Exporter はバージョン 5.64_01 から 5.64_03 に更新されました。
Exporter はもはや $SIG{__WARN__}
をオーバーロードしなくなりました
[perl #74472]
ExtUtils::CBuilder はバージョン 0.27 から 0.280203 に更新されました。
ExtUtils::Command はバージョン 1.16 から 1.17 に更新されました。
ExtUtils::Constant はバージョン 0.22 から 0.23 に更新されました。
ExtUtils::Constant::ProxySubs
で生成された AUTOLOAD ヘルパーコードは、
定数が足りないときに croak()
したり、XS の完全な AUTOLOAD
を
生成したりするようになり、これを使っている多くのモジュール
(Fcntl, File::Glob, GDBM_File, I18N::Langinfo, POSIX,
Socket) を単純化できるようになりました。
ExtUtils::Constant::ProxySubs はオプションとして全ての定数の名前を
パッケージの @EXPORT_OK
に push できるようになりました。
ExtUtils::Install はバージョン 1.55 から 1.56 に更新されました。
ExtUtils::MakeMaker はバージョン 6.56 から 6.57_05 に更新されました。
ExtUtils::Manifest はバージョン 1.57 から 1.58 に更新されました。
ExtUtils::ParseXS はバージョン 2.21 から 2.2210 に更新されました。
Fcntl はバージョン 1.06 から 1.11 に更新されました。
File::Basename はバージョン 2.78 から 2.82 に更新されました。
File::CheckTree はバージョン 4.4 から 4.41 に更新されました。
File::Copy はバージョン 2.17 から 2.21 に更新されました。
File::DosGlob はバージョン 1.01 から 1.04 に更新されました。
これにより、リテラルなかっこを含むパターンを指定できるようになりました: もはやエスケープする必要はありません。 Windows では、パターンがドライブ指定付きの相対グロブのとき、もはや 返されたファイル名に追加の ./ が付かなくなりました [perl #71712]。
File::Fetch はバージョン 0.24 から 0.32 に更新されました。
HTTP::Lite は 'http' スキームに対応しました。
fetch(1) ユーティリティは、http
と ftp
のスキームに対して
FreeBSD, NetBSD, Dragonfly BSD に対応しました。
File::Find はバージョン 1.15 から 1.19 に更新されました。
Windows でのバックスラッシュの扱いが改良され、C:\dir\/file のような パスはもはや生成されなくなりました [perl #71710]。
File::Glob はバージョン 1.07 から 1.12 に更新されました。
File::Spec はバージョン 3.31 から 3.33 に更新されました。
File::Spec::VMS で、いくつかの移植性に関する修正が行われました:
コロンはネイティブ filespecs でデリミタとして認識されるようになりました;
キャレットでエスケープされたデリミタは拡張 filespecs でのよりよい
扱いのために認識されるようになりました。
catpath()
は、入力ディレクトリ名が空の場合は現在のディレクトリではなく
空ディレクトリを返します;
abs2rel() は Unix 型の入力を正しく扱います (5.12.2)。
File::stat はバージョン 1.02 から 1.05 に更新されました。
-x
と -X
のファイルテスト演算子はスーパーユーザーによって
実行されたときに正しく動作するようになりました。
Filter::Simple はバージョン 0.84 から 0.86 に更新されました。
GDBM_File はバージョン 1.10 から 1.14 に更新されました。
これにより、DBM フィルタが使われたときのメモリリークが修正されます。
Hash::Util はバージョン 0.07 から 0.11 に更新されました。
Hash::Util は、未定義値があるハッシュを再帰的にロックしたときにも 偽の "uninitialized" 警告が出なくなりました [perl #74280]。
Hash::Util::FieldHash はバージョン 1.04 から 1.09 に更新されました。
I18N::Collate はバージョン 1.01 から 1.02 に更新されました。
I18N::Langinfo はバージョン 0.03 から 0.08 に更新されました。
langinfo()
は、既に文書に書かれている通りに、引数がなかった場合は
デフォルトとして $_
を使うようになりました。
I18N::LangTags はバージョン 0.35 から 0.35_01 に更新されました。
if はバージョン 0.05 から 0.0601 に更新されました。
IO はバージョン 1.25_02 から 1.25_04 に更新されました。
このバージョンの IO には新しい IO::Select が含まれていて、 IO::Handle オブジェクト (および派生クラスのオブジェクト) を、 たとえ基とのあるファイル記述子が閉じていたり不正であったりしていても、 IO::Select 集合から削除できるようになります。
IPC::Cmd はバージョン 0.54 から 0.70 に更新されました。
Win32 コマンドラインの分割での問題が解決しました。 単一の文字 "0" からなる引数が省かれていました (CPAN RT #62961)。
IPC::Open3 はバージョン 1.05 から 1.09 に更新されました。
open3() は、exec
呼び出しが失敗するとエラーとなるようになり、子プロセスが
非 0 のステータスで終了した場合と区別できるようになりました [perl #72016]。
内部の xclose()
ルーチンは文書通りにファイルハンドルを扱う方法を
知るようになり、STDIN
を使う子プロセスで複製しても
動作するようになりました [perl #76474]。
IPC::SysV はバージョン 2.01 から 2.03 に更新されました。
lib はバージョン 0.62 から 0.63 に更新されました。
Locale::Maketext はバージョン 1.14 から 1.19 に更新されました。
Locale::Maketext は外部キャッシュに対応しました。
この更新により、汚染された値の場合に
Locale::Maketext::Guts::_compile()
が無限ループになる問題も
修正されました (CPAN RT #40727)。
->maketext
呼び出しが $@
をバックアップおよび復元するように
なったので、エラーメッセージが削除されなくなりました (CPAN RT #34182)。
Log::Message はバージョン 0.02 から 0.04 に更新されました。
Log::Message::Simple はバージョン 0.06 から 0.08 に更新されました。
Math::BigInt はバージョン 1.89_01 から 1.994 に更新されました。
これは、その他のものと共に、2 項係数を計算するときの間違った結果が 修正されました [perl #77640]。
これはまた、use bigrat;
での sqrt($int)
で
クラッシュしなくなりました [perl #73534]。
Math::BigInt::FastCalc はバージョン 0.19 から 0.28 に更新されました。
Math::BigRat はバージョン 0.24 から 0.26_02 に更新されました。
Memoize はバージョン 1.01_03 から 1.02 に更新されました。
MIME::Base64 はバージョン 3.08 から 3.13 に更新されました。
エンコード/デコードされた base64 文字列の長さを計算する新しい 関数が含まれています。
「URL アプリケーション」のための base64 スキームを処理するための、 encode_base64url() 関数と decode_base64url() 関数が提供されます。
Module::Build はバージョン 0.3603 から 0.3800 に更新されました。
注目すべき変更は、いくつかのモジュールの非推奨化です。 Module::Build::Version は非推奨となり、 Module::Build は version プラグマに直接依存するようになりました。 Module::Build::ModuleInfo は非推奨となり、Module::Metadata と呼ばれる スタンドアロンのコピーを選びました。 Module::Build::YAML は非推奨となり、CPAN::Meta::YAML を選びました。
Module::Build は、CPAN 配布メタデータ仕様 CPAN::Meta::Spec の バージョン 2 に従った META.json と MYMETA.json も 生成するようになりました。 古い形式の META.yml と MYMETA.yml ファイルはまだ生成されます。
Module::CoreList はバージョン 2.29 から 2.47 に更新されました。
このリリースで更新されたモジュールの一覧の他に、
Filespec
モジュールを一覧に載せるのを停止しました。
このモジュールはコアには含まれません。
Module::CoreList を生成するスクリプトが、5.8.7 からコアに入った
VMS::Filespec モジュールとこれとを混乱していました。
Module::Load はバージョン 0.16 から 0.18 に更新されました。
Module::Load::Conditional はバージョン 0.34 から 0.44 に更新されました。
mro はバージョン 1.02 から 1.07 に更新されました。
NDBM_File はバージョン 1.08 から 1.12 に更新されました。
これは DBM フィルタが使われたときのメモリリークを修正します。
Net::Ping はバージョン 2.36 から 2.38 に更新されました。
NEXT はバージョン 0.64 から 0.65 に更新されました。
Object::Accessor はバージョン 0.36 から 0.38 に更新されました。
ODBM_File はバージョン 1.07 から 1.10 に更新されました。
これは DBM フィルタが使われたときのメモリリークを修正します。
Opcode はバージョン 1.15 から 1.18 に更新されました。
overload はバージョン 1.10 から 1.13 に更新されました。
overload::Method
は、自分自身オーバーロードされたクラスに bless されている
サブルーチンを扱うことが出来るようになりました [perl #71998]。
文書が大きく改良されました。 以下の 文書 を参照してください。
Params::Check はバージョン 0.26 から 0.28 に更新されました。
parent はバージョン 0.223 から 0.225 に更新されました。
Parse::CPAN::Meta はバージョン 1.40 から 1.4401 に更新されました。
最新の Parse::CPAN::Meta は、Perl コアの一部となった CPAN::Meta::YAML と JSON::PP を使って YAML と JSON のファイルを読み込めるようになりました。
PerlIO::encoding はバージョン 0.12 から 0.14 に更新されました。
PerlIO::scalar はバージョン 0.07 から 0.11 に更新されました。
文字列の末尾を超えた seek()
の後で read()
しても、もはや読み込むデータが
あるとは判断しなくなりました [perl #78716]。
PerlIO::via はバージョン 0.09 から 0.11 に更新されました。
Pod::Html はバージョン 1.09 から 1.11 に更新されました。
Pod::LaTeX はバージョン 0.58 から 0.59 に更新されました。
Pod::Perldoc はバージョン 3.15_02 から 3.15_03 に更新されました。
Pod::Simple はバージョン 3.13 から 3.16 に更新されました。
POSIX はバージョン 1.19 から 1.24 に更新されました。
POSIX シグナル定数のための定数が追加されました。
re はバージョン 0.11 から 0.18 に更新されました。
use re '/flags'
副プラグマが新しいです。
regmust()
関数はプラグ可能なエンジン所有の正規表現を呼び出すと
クラッシュしていました。
今では代わりに croak します。
regmust()
はもはやメモリリークしなくなりました。
Safe はバージョン 2.25 から 2.29 に更新されました。
reval()
と rdo()
で返されるコードリファレンスは wrap_code_refs()
で
ラップされるようになりました (5.12.1)。
これにより、コードリファレンスを検索したときに無限ループになる 可能性がある問題が修正されます。
デフォルトの共有のためにいくつかの version::vxs::*
ルーチンが
追加されました。
SDBM_File はバージョン 1.06 から 1.09 に更新されました。
SelfLoader はバージョン 1.17 から 1.18 に更新されました。
汚染モードでも動作するようになりました [perl #72062]。
sigtrap はバージョン 1.04 から 1.05 に更新されました。
バックトレースを生成するときに、もはや読み込み専用引数を変更しようと しなくなりました [perl #72340]。
Socket はバージョン 1.87 から 1.94 に更新されました。
上述の 改良された IPv6 対応 を参照してください。
Storable はバージョン 2.22 から 2.27 に更新されました。
オーバーロードされたクラスの性能が向上しました。
これは UTF-8 文字列を含むコードリファレンスの正しいシリアル化対応が
追加されました。
結果として Storable のマイナーバージョン番号が変更されたので、
$Storable::accept_future_minor
を FALSE
値に設定している
Storable ユーザーはエラーを見ることになります
(さらなる詳細については Storable/FORWARD COMPATIBILITY を
参照してください)。
凍結 (freezing) 中に Perl のスタックが再配置されたとき、凍結はもはや 混乱しなくなりました [perl #80074]。
Sys::Hostname はバージョン 1.11 から 1.16 に更新されました。
Term::ANSIColor はバージョン 2.02 から 3.00 に更新されました。
Term::UI はバージョン 0.20 から 0.26 に更新されました。
Test::Harness はバージョン 3.17 から 3.23 に更新されました。
Test::Simple はバージョン 0.94 から 0.98 に更新されました。
その他の多くのことの他に、plan
や no_plan
のない副テストには
暗黙に done_testing()
が追加されるようになりました。
Thread::Semaphore はバージョン 2.09 から 2.12 に更新されました。
セマフォをデクリメントすることをさらに制御する二つの新しいメソッドが
提供されます: down_nb
と down_force
です。
Thread::Queue はバージョン 2.11 から 2.12 に更新されました。
threads はバージョン 1.75 から 1.83 に更新されました。
threads::shared はバージョン 1.32 から 1.36 に更新されました。
Tie::Hash はバージョン 1.03 から 1.04 に更新されました。
Tie::Hash->TIEHASH()
の呼び出しが無限ループしていました。
今では croak
します。
Tie::Hash::NamedCapture はバージョン 0.06 から 0.08 に更新されました。
Tie::RefHash はバージョン 1.38 から 1.39 に更新されました。
Time::HiRes はバージョン 1.9719 から 1.9721_01 に更新されました。
Time::Local はバージョン 1.1901_01 から 1.2000 に更新されました。
Time::Piece はバージョン 1.15_01 から 1.20_01 に更新されました。
Unicode::Collate はバージョン 0.52_01 から 0.73 に更新されました。
Unicode::Collate は Unicode 6.0.0 を使うように更新されました。
Unicode::Collate::Locale は大量の新しいロケールに対応しました: ar, be, bg, de__phonebook, hu, hy, kk, mk, nso, om, tn, vi, hr, ig, ja, ko, ru, sq, se, sr, to, uk, zh, zh__big5han, zh__gb2312han, zh__pinyin, zh__stroke
以下のモジュールが追加されました:
zh__big5han
のための Unicode::Collate::CJK::Big5 は
CJK 統合表意文字を CLDR の big5han 順序で調整します。
zh__gb2312han
のための Unicode::Collate::CJK::GB2312 は
CJK 統合表意文字を CLDR の gb2312han 順序で調整します。
Unicode::Collate::CJK::JISX0208 は 6355 文字の漢字 (CJK 統合表意文字) を JIS X 0208 の順序で調整します。
Unicode::Collate::CJK::Korean は CJK 統合表意文字を CLDR の 韓国語順序で調整します。
zh__pinyin
のための Unicode::Collate::CJK::Pinyin は
CJK 統合表意文字を CLDR のピンイン順序で調整します。
zh__stroke
のための Unicode::Collate::CJK::Stroke は
CJK 統合表意文字を CLDR の筆画順序で調整します。
これはまた、このモジュールの ピュア Perl 版から XS 版への切り替えを 見るようになりました。
Unicode::Normalize はバージョン 1.03 から 1.10 に更新されました。
Unicode::UCD はバージョン 0.27 から 0.32 に更新されました。
新しい関数である Unicode::UCD::num() が追加されました。
この関数は、渡された文字列の数値としての値か、あるいは文字列が全体的に
「安全」な数値としての値がない場合は undef
を返します。
(さらなる詳細と、「安全」の定義については、Unicode::UCD/num を
参照してください。)
この更新には多くのバグ修正も含まれています:
charinfo()
Unicode Version 6.0.0 の Corrigendum #8 で更新されましたが、 Perl 5.14 と同様、符号位置 U+1F514 には名前がないという例外があります。
ハングル音節符号位置に正しい名前が付き、その分解は常に Lingua::KO::Hangul::Util をインストールする必要なしに出力されます。
CJK (Chinese-Japanese-Korean) 符号位置 U+2A700 から U+2B734 と、 U+2B740 から U+2B81D は正しく扱えるようになりました。
これらの CJK 符号位置はが持っている数値を出力するようになりました。
複数の別名のある符号位置の名前は正しくなりました。
charscript()
他の値が割り当てられていない符号位置の用字では undef
ではなく
正しく "Unknown" を返すようになりました。
charblock()
他の値が割り当てられていない符号位置のブロックでは undef
ではなく
正しく "No_Block" を返すようになりました。
version はバージョン 0.82 から 0.88 に更新されました。
バグにより、エクスポートされたときにis_strict() 関数と is_lax()
関数が
動作していませんでしたが、修正されました (5.12.1)。
warnings はバージョン 1.09 から 1.12 に更新されました。
引数なしの use warnings
の呼び出しは、大幅に効率的になりました。
warnings::register はバージョン 1.01 から 1.02 に更新されました。
warnings::register を使ったパッケージ名以外の警告カテゴリを 登録できるようになりました。 さらなる情報については perllexwarn(1) を参照してください。
XSLoader はバージョン 0.10 から 0.13 に更新されました。
VMS::DCLsym はバージョン 1.03 から 1.05 に更新されました。
二つのバグが修正されました [perl #84086]:
TIEHASH
での思い違いによって、ハッシュを tie したときにシンボル
テーブル名が失われていました。
結果として、全ての tie されたハッシュがローカルシンボルテーブルと
相互作用していました。
コンストラクタへの呼び出しでシンボルテーブル名が明示的に指定されない限り、
特殊キー :LOCAL
の検索は、ローカルシンボルテーブルに接続したオブジェクトの
識別に失敗していました。
Win32 はバージョン 0.39 から 0.44 に更新されました。
このリリースにはいくつかの新しい関数があります: Win32::GetSystemMetrics(), Win32::GetProductInfo(), Win32::GetOSDisplayName() です。
Win32::GetOSName() と Win32::GetOSDisplayName() から返される名前が 正しくなりました。
XS::Typemap はバージョン 0.03 から 0.05 に更新されました。
Perl 5.12.0 のリリースノートで約束した通り、以下のモジュールがコア配布から 削除されました; もし必要なら代わりに CPAN からインストールしてください。
Class::ISA は Perl コアから削除されました。 以前のバージョンは 0.36 でした。
Pod::Plainer は Perl コアから削除されました。 以前のバージョンは 1.02 でした。
Switch は Perl コアから削除されました。 以前のバージョンは 2.16 でした。
Shell の削除は 5.14 以降まで延期されました; 5.12.0 で出荷された Shell の実装が、コアから削除される予定であるという 警告を正しく出力していなかったからです。
perlgpl は Perl と配布されている README に含まれていたままの形の GPL バージョン 1 を含むように更新されました。
Perl 5.12.1 から 5.12.3の perldelta ファイルがメンテナンスブランチから 追加されました: perl5121delta, perl5122delta, perl5123delta。
POD 文書のための新しいスタイルガイドで、ほとんどは pod2man(1) man ページの NOTES の節から分離されました。
後述する perlhack と perlrepository の刷新 を参照してください。
Perl 5.12.0 の perlmodlib ページは、リストを生成するスクリプトのバグにより、 多くのモジュールが漏れていました。 これは修正されました [perl #74332] (5.12.1)。
perlebcdic には EBCDIC と Latin1/ASCII を変換するために
tr///
を使うのに便利な表があります。
表は記述されているのと逆になっていましたが、表で使われているコードは
特定の例では正しく動作していました。
表は逆順に変更され、サンプルコードも対応するように変更されました。
また、表は 8 進数から 16 進数に変更され、pod にあるレシピは全ての値が 同じ長さになるように先頭にゼロが表示されるように変更されました。
perlunicode は、Perl が Unicode データに対して大文字、小文字、それ以外 の変換をどのように行うかについてのオーバーライド、切り刻み、およびその他の 調整方法に関する説明と、 他の人のコードの振る舞いを変えることなく自分のコードの振る舞いを変えるための、 範囲的な変更を提供する方法を含むようになりました。
これは既に真でしたが、記録として公式に表明しました (5.12.2)。
\xHH
エスケープと \oOOO
エスケープの説明perlop はこれら二つの文字エスケープに関するより詳細な説明で 更新されました。
perlrun において、-0NNN オプションのうち -0400 以上のものの 振る舞いが明確化されました (5.12.2)。
perlpolicy に、メンテナンスブランチにどのようなパッチが受け入れられるかに ついてのポリシーが追加されました (5.12.1)。
perlpolicy に、「非推奨」("deprecation") のような言葉の定義とともに、 互換性と非推奨に関するポリシーが追加されました (5.12.2)。
以下の示す、既存の診断メッセージが文書化されました:
Ambiguous use of %c resolved as operator %c
Ambiguous use of %c{%s} resolved to %c%s
Ambiguous use of %c{%s[...]} resolved to %c%s[...]
Ambiguous use of %c{%s{...}} resolved to %c%s{...}
Ambiguous use of -%s resolved as -&%s()
Invalid strict version format (%s)
Invalid version format (%s)
Invalid version object
perlbook はより多くの有名な書籍を対象とするように拡張されました。
SvTRUE
マクロperlapi にある SvTRUE
マクロの説明は get-magic が処理されないという
説明が単純に間違っていました。
これは修正されました。
op 木を処理するためのいくつかの API 関数が新たに文書化されました。
perlvar は、変数の順序を変えて、主題毎にグループ化しました。 Perl 5.000 以降に導入された変数はそれぞれ利用可能になったバージョンを 記しています。 perlvar は、非推奨の変数がいつ削除されたかを記すための新しい節が 追加されました。
これらは perldata で文書化されました。
use locale
とフォーマットperlform と perllocale は、use locale
がフォーマットに与える
影響を述べるように修正されました。
overload の文書はほとんど書き直されました。 はるかに直接的で明確になりました。
perlhack 文書はとても短くなり、Perl 5 開発プロセスと Perl への パッチの投稿に焦点を当てています。 技術的な内容は新しい文書である perlsource, perlinterp, perlhacktut, perlhacktips に移動しました。 技術的な内容は軽く編集されただけです。
perlrepository 文書は perlgit に名前が変わりました。 この新しい文書は単に git で Perl ソースコードを扱うための手引き書です。 perlrepository にあったその他の内容は perlhack に移動しました。
perlfaq4 の例が Time::Piece の使い方を示すように更新されました。
以下の追加や変更が、警告や致命的エラーメッセージ含む診断出力に行われました。 完全な診断メッセージの一覧については、perldiag を参照してください。
このエラーは、属性ハンドラに渡されたサブルーチンのリファレンスが 呼び出されたとき、そのサブルーチンがクロージャだったときに起こります [perl #68560]。
Perl は、ユーザー定義文字特性関数 (\p{IsFoo}
や \p{InFoo}
) の
呼び出しを含む正規表現をコンパイルしようとしたときに汚染されているデータを
検出しました。
perlunicode/User-Defined Character Properties と perlsec を
参照してください。
この新しいエラーは、新しいエントリを含むオブジェクトを作る デストラクタのオブジェクトを含む新しい型グロブを作る解放された 型グロブの中のオブジェクトのデストラクタ、といったものが 呼び出されたときに起こります。
この新しい致命的エラーは、エクステンションによって供給されたパースコードが 検知できる方法でパーサの API に違反しているときに発生します。
この新しいエラーは、パイプを閉じようとしているときに内部の一貫性チェックに 失敗したときにのみ発生します。
正規表現パターンに、相互に排他な修飾子の一つが繰り返されています。
正規表現パターンに、相互に排他な修飾子が複数あります。
このエラーは、!~
が s///r
や y///r
で使われたときに起こります。
エスケープされていない "{" の直後に \b
または \B
を使うことは、
Perl 自身の将来のリリースでの使用を予約するために非推奨となりました。
Unicode サロゲートや非 Unicode 文字に対して (大文字小文字の畳み込みのような) Unicode の意味論 を要求する操作を実行すると、この警告が発生します。
詳しくは、上述の かっことしての qw(...) の使用 を参照してください。
strict 'vars'
の下での "Variable $foo is not imported" 警告は
"misc" カテゴリに割り当てられたので、no warnings
はこれを
抑制します [perl #73712]。
warn()
と die()
は、STDERR
がバイト単位で扱われているときに
バイトの範囲外の文字が送られると "Wide character" 警告を
出すようになりました。
"Layer does not match this perl" エラーメッセージはより助けになる、 以下のメッセージに置き換えられました [perl #73754]:
PerlIO layer function table size (%d) does not match size expected by this perl (%d)
PerlIO layer instance size (%d) does not match size expected by this perl (%d)
条件文の中で定数が変数に代入されるときに出力される
"Found = in conditional" 警告は、定数が実際にはサブルーチンあるいは
use constant
で生成されたものである場合には出力されなくなりました;
なぜなら定数の値はプログラムが書かれた時点ではわからないかもしれないからです
[perl #77762]。
以前は、もしプラットフォームに gethostbyaddr()
, gethostbyname()
,
gethostent()
関数のどれも実装されていない場合、すべて
"Unsupported socket function 'gethostent' called" というメッセージと
getnet*() および getserv*() と似たメッセージで die していました。
これは修正されました。
認識できない正規表現エスケープが渡された時の警告メッセージは、 2 文字のエスケープに引き続く "{" が含まれるようになりました。 例えば、"\q" の代わりに "\q{" が出力されます。
perlbug は、REPLY-TO と REPLYTO の変数が空のとき、リターンアドレスとして EMAIL 環境変数を見るようになりました。
perlbug は以前は "From:" ヘッダを生成していなかったので、メールが 削除されてしまう可能性がありました; このヘッダが含まれるようになりました。
ユーザーのアドレスは Return-Path として使われるようになりました。
最近の多くのシステムは有効なインターネットドメイン名を持っておらず、 perlbug@perl.org は解決できない return-path をもつ電子メールは 受け付けません。 それで、どこかのメールキューで引っかかる可能性を減らすために、 ユーザーのアドレスが sendmail に渡されるようになりました [perl #82996]。
perlbug は常に、推測された電子メールアドレスを変更する機会を 報告者に与えるようになりました (5.12.2)。
perlbug は、-d と -v オプションを使ったときに非初期化値に関して 警告を出さなくなりました (5.12.2)。
新しいセッションを fork と spawn した後、fork したプロセス毎に一つ、 リモート端末が動作します。
ptargrep(1) 、tar アーカイブ内のファイルの内容に対してパターンマッチングを
適用するための新しいユーティリティです。
これは Archive::Tar
に同梱されています。
上述の Policy_sh.SH の命名の修正によって Policy.sh が不正になりました も 参照してください。
mingw64 クロスコンパイラ用の CCINCDIR と CCLIBDIR は、直後に記述している $(CCHOME) ではなく、正しく $(CCHOME)\mingw\include と \lib を 使うようになりました。
これは、Config.pm と Config_heavy.pl "incpath", "libpth", "ldflags", "lddlflags", "ldflags_nolargefiles" の値が正しく設定されることを意味します。
make test.valgrind
は cpan/dist/ext の分割に対応するように
調整されました。
対応しているコンパイラでは、-Wwrite-strings がデフォルトで cflags に 追加されるようになりました。
Encode モジュールは(再び)静的 Perl ビルドに含まれるようになりました。 この状況のための特殊ケースの扱いは Perl 5.11.0 で壊れていましたが、 修復されました。
PerlIO バッファの以前のデフォルトサイズ (4096 バイト) は、8192 バイトと ローカルの BUFSIZ のどちらか大きい方に増やされました。 ベンチマークに寄れば、10 年単位の古いデフォルトを倍にすることで、 unix の top で perlIO のデフォルト層を使ったときに 25% から 50% 読み書き性能が向上しました。 古い値に戻したり、より大きな値にするために、デフォルトでないサイズを 選択したい場合は、以下のように設定します:
./Configure -Accflags=-DPERLIOBUF_DEFAULT_BUFSIZ=N
ここで N は設定したいバイト数です; これはおそらくページサイズの倍数に するべきでしょう。
clang
でビルドしたときに 3 項演算子で "incompatible operand types
"
エラーが発生する問題が修正されました (5.12.2)。
Perl は、nosuid
でマウントされていることが検出されたパーティションでは
File::Copy の setuid でのテストを省略するようになりました (5.12.2)。
Perl を AIX 4.2 でビルドできるようになりました (5.12.1)。
このプラットフォームの対応の最後の名残が Perl 配布から削除されました。 これはバージョン 5.12.0 で公式に中断されました。 それ以前何年も作業されていませんでした。
このプラットフォームの対応の最後の名残が Perl 配布から削除されました。 これはもっと前のバージョンで公式に中断されました。
README.aix は、XL C/C++ V11 コンパイラスイートに関する情報で 更新されました (5.12.2)。
ARM での d_u32align
設定調査が修正されました (5.12.2)。
MakeMaker は cygwin で man ページをビルドするように更新されました。
改良された rebase の振る舞い
cygwin で DLL が更新されると、古いイメージベースアドレスは再利用されます。 これはほとんどの rebase エラー、特にコア DLL の更新時のエラーを 解決します。 さらなる情報については http://www.tishler.net/jason/software/rebase/rebase-2.4.2.README を 参照してください。
標準 cygwin dll 接頭辞の対応 (FFI で必要)
更新されたビルドヒントファイル
FreeBSD 7 はもはや /usr/bin/objformat を含んでいません。 ビルド時に、バージョンが 7 以上の場合は objformat のチェックを スキップし、ELF を仮定します (5.12.1)。
HP-UX で use64bitall
に昇格することなく -Duse64bitint を
使えるようになりました (5.12.1)。
文字列から浮動小数点数への変換は IRIX システムでより精密になりました [perl #32380]。
初期のバージョンの Mac OS X (Darwin) は setregid()
, setreuid()
,
setrgid(,), setruid()
関数の実装がバグっていたので、Perl はそれらが
存在しない振りをしていました。
これらの関数はMac OS 10.5 (Leopard; Darwin 9) で認められるようになったので、 これは修正されました [perl #72990]。
以前は、MirBSD で共有 libperl.so で Perl をビルドする(デフォルト設定)と、 インストールまでは動作します; しかし一旦インストールすると、 libperl が見つからなくなります。 Path の扱いは、他の BSD 方言と同じように扱われるようになりました。
NetBSD ヒントファイルは、システムの malloc がデフォルトに なるように変更されました。
OpenBSD > 3.7 は mmap-ベースの新しい malloc の実装があり、 メモリを OS に返せるようになっています; しかし、Perl のこの malloc の 使用によりかなりの速度低下を引き起こすので、代わりに Perl の malloc を 使うことを新しいデフォルトにしました [perl #75742]。
Perl は再び (以前は Stratus VOS として知られていた) OpenVOS で ビルドできるようになりました [perl #78132] (5.12.3)。
DTrace は Solaris に対応しました。 以前はビルドに失敗していましたが、これは修正されました [perl #73630] (5.12.3)。
古い (7.3-2 以前の) VMS システムでのエクステンションのビルドは、 configure.com が DCL シンボル長の制限である 1K に引っかかったために 壊れていました。 コアビルドのエクステンションの一覧のアセンブル時にはこの制限内に なるようにしました (5.12.1)。
Perl の -Uuseperlio 付きでの設定とビルドを修正しました (5.12.1)。
PerlIOUnix_open
は VMS のデフォルトパーミッションを
考慮するようになりました。
perlio
がデフォルトになり、unix
がデフォルトの底の層になったとき、
Perl からファイルを作成する最も一般的な方法は、パーミッションマスクとして
常に明示的に 0666
を使う PerlIOUnix_open
になりました。
これはパーミッションを RMS デフォルトと ACL から継承するのを
妨げるので、この問題を回避するために、
open()
に 0777
を渡すようになりました。
theVMS CRTL において、0777
は現在の umask との交差に加えて、特別な
意味を持ちます;
特に、これは Unix syscall がネイティブなデフォルトのパーミッションを
保存できるようになります (5.12.3)。
コア C ソースとエクステンションでの 31 文字より長いシンボルの短縮化は デフォルトでは xsubpp (XS コードで生成されたシンボルに対してのみ できます) ではなく C コンパイラで行うようになりました。 設定時に -Uuseshortenedsymbols を指定することで、xsubpp のシンボル短縮化を 再有効化できますが、コアソースをコンパイルするには多少の作業が必要です。
レコード指向ファイル (レコード形式変数や固定制御付き変数) を perlio
層で
書き込みように開いたとき、PerlIO バッファが埋まったときに偽の行分割が
導入されるのを避けるために、行バッファリングを使うようになりました。
git_version.h がインストールされるようになりました。 これは v5.12.0 にあったミスで、これによりいくつかのエクステンションが ビルドできなくなっていました (5.12.2)。
stat() のいくつかのメモリリークが 修正されました (5.12.2)。
二重割り当てによる Perl_rename()
でのメモリリークが
修正されました (5.12.2)。
(realpath() と realname()
で使われている) vms_fid_to_name()
での
メモリリークが修正されました (5.12.2)。
上述の fork() エミュレーションはシグナルを送られた子プロセスを待ちません と Windows では Perl ソースコードをテキストモードで読み込みます も参照してください。
SDK2003SP1 コンパイラのビルドプロセスが修正されました。
Visual Studio 2010 でのコンパイルに対応しました。
古い 32-ビットコンパイラを使ったとき、_USE_32BIT_TIME_T
定義が
$Config{ccflags}
に設定されます。
これによって、新しいコンパイラを使って XS エクステンションを
コンパイルするけれども、Perl 本体は古い 32-ビットコンパイラで
コンパイルしたときの互換性が向上します。
$Config{gccversion}
は、Perl が http://mingw64.org の
mingw64 コンパイラを使ってビルドされたときに正しく
設定されるようになりました [perl #73754]。
Perl を mingw64 x64 クロスコンパイラでビルドするとき、
Config.pm と Config_heavy.pl にある
incpath
, libpth
, ldflags
, lddlflags
, ldflags_nolargefiles
の
値が正しくセットされていませんでした;
これは、このコンパイラでは、インクルードとライブラリのディレクトリが
$(CCHOME)
の直下ではないからです (5.12.2)。
Cwd
の修正により、PATH に C:\MSYS\bin がある時に mingw と dmake を
使ってよりスムーズにビルドプロセスが進むようになりました。
Visual C++ 2010 でのビルド対応が進行中ですが、まだ完全ではありません。 さらなる詳細については README.win32 や perlwin32 を参照してください。
外部供給される crypt()
を使ったり、全く crypt()
を使わずにビルドするための
オプションは削除されました。
Perl は Windows 用に独自の crypt()
実装を提供し、
ときどきこの配布の一部を省略する必要があるという政治的な状況は
なくなって久しいです。
スレッドを作成するモジュールは、新しい関数である Perl_clone_params_new()
を
呼び出すことで CLONE_PARAMS
構造体を作成し、Perl_clone_params_del() で
解放するようになりました。
これにより、将来 CLONE_PARAMS
の内部配置が変更されたときの互換性を
確保して、正しく割り当てと初期化が行われるようにします。
文や式のパースのためのいくつかの関数が追加されました: これらの関数は、Perl のパース中に再帰下降の方式で XS コードによって起動され、 モジュールが標準 Perl 文法を拡張できるようにします。
parse_stmtseq() は文の並びを、閉じ中かっこか EOF までパースします。
parse_fullstmt() はオプションの ラベルを含む、完全な Perl 文をパースします。
parse_barestmt() はラベル抜きの文をパースします。
parse_block() はコードブロックをパースします。
parse_label() は文から分離して、文のラベルを パースします。
parse_fullexpr()
,
parse_listexpr()
,
parse_termexpr()
,
parse_arithexpr()
はさまざまな
優先順位レベルで、再帰降下パースを実行します。
ヒントハッシュ %^H
を実行時に内部調査するための新しい C API が
追加されました。
詳しくは perlapi の cop_hints_2hv
, cop_hints_fetchpvn
,
cop_hints_fetchpvs
, cop_hints_fetchsv
, hv_copy_hints_hv
を
参照してください。
Perl が %^H
のために使う内部構造にアクセスするための新しい実験的な
API が追加されました。
perlapi の、cophh_
で始まる関数を参照してください。
caller()
への C インターフェースcaller_cx
関数は、XSUB-作者のための caller()
の等価物として追加されました。
詳しくは perlapi を参照してください。
エクステンションモジュールの XS コードはサブルーチンに (XS で
実装されているか Perl で実装されているか) のアノテーションが
付けられるようになったので、任命された XS コードはそのサブルーチンの
op 木を変更するためにコンパイル時 (具体的には op チェックの一部として)
呼び出されます。
(エクステンションモジュールによって供給される) コンパイル時のチェック関数は
プロトタイプとして記述できない引数処理の実装、カスタマイズされた
コンパイル時警告の生成、純粋な関数のための定数の畳み込みの実行、
充分に単純な op からなるサブルーチンのインライン化、呼び出し全体の
カスタム op への置き換えなどが可能です。
以前はこれは全て entersub
op チェッカをフックすることで可能でしたが、
新しい機構は簡単にフックを特定のサブルーチンに結びつけることができます。
perlapi/cv_set_call_checker を参照してください。
カスタムチェックフックを書くのを助けるために、標準の entersub
op チェックに
あるいくつかの副タスクが分離され、API に露出しました。
カスタム ops は新しい custom_op_register
C 関数と XOP
構造体で
登録できるようになりました。
これにより、将来カスタム op の新しいプロパティをより簡単に
追加できるようになります。
二つの新しいプロパティである xop_class
と xop_peep
が既に
追加されています。
xop_class
は OA_*OP 定数の一つです。
これにより、B やその他の内部検査機構が BASEOP でないカスタム op で
動作するようになります。
xop_peep
は、Perl_rpeep
からこの種類の op を呼び出す関数への
ポインタです。
さらなる詳細については perlguts/Custom Operators と perlapi/Custom Operators を参照してください。
古い PL_custom_op_names
/PL_custom_op_descs
インターフェースもまだ
対応していますが、勧められません。
新しい Perl_blockhook_register
関数を使って、コンパイル時の Perl の
レキシカルスコープ機構にフックする XS コードが可能になりました。
perlguts/"Compile-time scope hooks" を参照してください。
PL_peepp
に加えて、トップレベル覗き穴最適化器をフックするために、
op 木の再度チェーンへの再帰する最適化器へフックするための
PL_rpeepp
が利用可能になりました。
以下の関数/マクロが API に追加されました。
*_nomg
マクロは _nomg
なし版と等価ですが、get-magic を無視します。
_flags
で終わっているものは、get-magic を処理するかどうかを
指定できます。
sv_2bool_flags SvTRUE_nomg sv_2nv_flags SvNV_nomg sv_cmp_flags sv_cmp_locale_flags sv_eq_flags sv_collxfrm_flags
これらのケースのいくつかでは、非-_flags
関数は新しい関数の
ラッパーと置き換えられました。
末尾に pvn が付く多くの関数に、等価な pv/pvs/sv
版が追加されました。
リスト op 構築関数が API に追加されました。 perlapi の op_append_elem, op_append_list, op_prepend_elem を参照してください。
LINKLIST
実行順 op チェーンを構成する op 構築の一部である LINKLIST マクロが追加されました。
save_freeop
, save_op
, save_pushi32ptr
, save_pushptrptr
関数が
API に追加されました。
スタッシュは、通常の名前に追加して、有向な名前のリストを持つように
なりました。
最初の有効な名前は HvENAME
マクロ経由でアクセスでき、これは
MRO 線形化で使う推奨される名前となりました
(HvENAME
がない場合は HvNAME
にフォールバックします)。
これらの名前は hv_ename_add
と hv_ename_delete
を使って追加および
削除されます。
これら二つの関数は API の一部では ありません。
mg_findext()
関数と
sv_unmagicext()
関数が API に追加されました。
これらはエクステンションの作者がマジックの種類およびマジックの仮想テーブルを
基に、スカラに付加されているマジックを探したり削除したりできるようにします;
sv_magicext()
が特定の種類と与えられた仮想テーブルのマジックをスカラに
付与する方法と同様です。
これにより、SV
に付与されているマジックを探すために、エクステンションが
その MAGIC
ポインタを辿る必要をなくします。
find_rundefsv
この関数は、レキシカルであろうと動的であろうと、$_
を表現する
SV を返します。
Perl_croak_no_modify
Perl_croak_no_modify()
は Perl_croak("%s", PL_no_modify)
の
簡略形です。
PERL_STATIC_INLINE
定義C コンパイラが C99 形式の静的インライン関数に対応している場合、
静的インライン関数を使うような指示を提供する、
PERL_STATIC_INLINE
定義が追加されました。
対応していない場合は、普通の static
を返します。
HAS_STATIC_INLINE
はコンパイラが実際にインライン関数に対応しているか
どうかをチェックするのに使えます。
pv_escape
オプションpv_escape
に、ASCII 以上の全ての文字を 16 進数でダンプする
PERL_PV_ESCAPE_NONASCII
オプションが新しく追加されました。
以前は、全ての文字を 16 進数にするか、Latin1 非-ASCII を 8 進数にするか
でした。
lex_start
lex_start
が API に追加されましたが、実験的なものと考えられています。
op_scope()
と op_lvalue()
op_scope()
関数と op_lvalue()
関数が API に追加されましたが、実験的なものと
考えられています。
PERL_POLLUTE
は削除されました後方互換性のために古い 5.005 のシンボルを露出させるための
PERL_POLLUTE
を定義するオプションは削除されました。
この使用は常に勧められず、
MakeMaker はより具体的な回避方法を持っています:
perl Makefile.PL POLLUTE=1
これは、まだ 5.6 命名規約に更新されていない (そして今では完全に 古いものである) モジュールで使えます。
Perl の API が互換性のない形で変更されたとき (普通はメジャーリリース間で 起こります)、以前のバージョンの Perl 用にコンパイルされた XS モジュールは もはや動作しなくなります。 新しい Perl 用に再コンパイルする必要があります。
XS_APIVERSION_BOOTCHECK
マクロは、確実にモジュールが再コンパイルされて、
ユーザーが間違って古い perl 用にコンパイルされたモジュールを新しい perl で
読み込むのを防ぐために追加されました。
新しくコンパイルされたエクステンションが読み込まれる度に呼び出される
このマクロは、実行中の perl の API のバージョンと、モジュールのコンパイルされた
バージョンを比較し、それが一致しなければ例外を発生させます。
C API 関数 Perl_fetch_cop_label
の第 1 引数は、ユーザーから実装詳細を
分離するために、struct refcounted_he *
から COP *
に変更されました。
この API 関数は「変更されるかもしれない」という印が付けられ、 コアの外で使われることはなさそうです。 (CPAN を展開したものや Google コードサーチではこれを参照しているものは 見つかりませんでした。)
GvCV()
と GvGP()
はもはや左辺値ではありません新しい GvCV_set()
マクロと GvGP_set()
マクロがこれら二つのマクロへの
代入の代替として提供されています。
これにより、gp_cv
スロットへの代入を完全に制御するのに必要な、
GV と CV の間の後方参照マジックを取り除くためのコミットが将来
出来るようになります。
CvGV()
はもはや左辺値ではありませんある種の状況では、CV の CvGV()
フィールドは参照カウントされます。
一貫性のある振る舞いを保証するために、例えば CvGV(cv) = gv
のような
直接の代入はコンパイルエラーになります。
新しいマクロである CvGV_set(cv,gv)
が、この操作を安全に行うために
導入されました。
この新しいマクロにも関わらず(そしてこの節に書いているにも関わらず)
このフィールドの変更は公式 API の一部ではないことに注意してください。
CvSTASH()
はもはや左辺値ではありませんCvSTASH()
マクロは右辺値としてのみ使えるようになりました。
CvSTASH_set()
が、CvSTASH() への代入の代わりとして追加されました。
これは、バックリファレンスが正しく扱われるのを保証するためです。
これらのマクロは API の一部ではありません。
newFOROP
と newWHILEOP
の呼び出し規約パーサがラベルを扱う方法が整理され、リファクタリングされました。 結果として、newFOROP() コンストラクタ関数は、もはやどのラベルが状態に 入るかを示す引数を取らなくなりました。
newWHILEOP()
関数と newFOROP()
関数はもはや行番号を引数として
受け付けなくなりました。
uvuni_to_utf8_flags
と utf8n_to_uvuni
に渡されるフラグuvuni_to_utf8_flags() と utf8n_to_uvuni() へのフラグ引数の一部が
変更されました。
これは、ある種の状況で問題となる符号位置の内部保管と操作が可能になった
結果です。
従って、これらの関数のデフォルトアクションはこれらの符号位置を認めるように
補完されました。
新しいフラグは perlapi で文書化されています。
問題のある符号位置を拒絶することが必要なコードは、この新しいフラグを
使うように変更する必要があります。
一部のフラグ名は後方ソース互換性のために保持していますが、何もしません;
今ではデフォルトとなっています。
しかし UNICODE_ALLOW_FDD0
, UNICODE_ALLOW_FFFF
, UNICODE_ILLEGAL
,
UNICODE_IS_ILLEGAL
は削除されました;
perlunicode/Non-character code points に記述されているように、
Unicode 非文字符号位置をどう扱うべきかに関して本質的に壊れたモデルに
基づくものだからです。
バグ修正の抜粋 の Unicode の節も参照してください。
Perl_ptr_table_clear
Perl_ptr_table_clear
はもはや Perl の公式 API の一部ではありません。
これを呼び出すと非推奨警告が生成され、将来のリリースで削除されます。
sv_compile_2op
sv_compile_2op() API 関数は非推奨となりました。 検索した結果 CPAN にこれを使っているものはありませんでしたので、 これの影響はないはずです。
これは op 木へのコードをコンパイルするための API を提供しようとしましたが、 囲まれたスコープ内のレキシカルに対して正しく結びつけることに失敗していました。 引数と返り値の制限の中でこの問題を修正することは不可能です。
find_rundefsvoffset
find_rundefsvoffset
関数は非推奨となりました。
この設計は、確実に実行時にレキシカルな $_
を得るには不十分と思われます。
代わりに、新しい find_rundefsv
関数か UNDERBAR
マクロを使ってください。
これらはレキシカルか動的かに関わらず、 $_
を表現する正しい SV を
直接返します。
CALL_FPTR
and CPERLscope
これらは Perl 5.8 で削除された、C++ オブジェクトを使った MULTIPLICITY
の
古い実装から残されていました。
今ではこれらのマクロは全く何もしないので、もう使うべきではありません。
互換性のために、これらはまだ外部 XS
コードのために定義されています。
PERL_CORE
を定義しているエクステンションだけが今回
更新しなければなりません。
die
の最終ステージの C スタックの巻き戻しのための手順は、どのように
ターゲットスタックフレームを識別するかが変更されました。
今では別の変数 PL_restartjmpenv
を使うようになりました; 以前は
名目上捨てられた eval
コンテキストフレームにある
blk_eval.cur_top_env
ポインタに依存していました。
この変更は、Perl レベルの巻き戻しのさまざまなステージで実行中の
コードが、もはや幽霊フレームを破壊することを避けるために気をつかう
必要はありません。
スコープスタックのエントリの形式が変更され、結果としてメモリ消費が約 10 % 減少しました。 特に、それぞれのアクティブなレキシカル変数を記録するためのスコープスタックで 使われるメモリは半分になりました。
ポインタテーブルのためのメモリ割り当てが変更されました。
以前は Perl_ptr_table_store
は SV
ボディおよび HE
と同じ領域から
メモリを割り当て、解放されたメモリはインタプリタが終了するまでその領域に
残っていました。
今では特定のポインタテーブル専用の領域からメモリを割り当てられ、このメモリは
Perl_ptr_table_free
が呼び出されるとシステムに返されます。
さらに、割り当てと解放は両方とも CPU パワーを使わなくなります。
UNDERBAR
UNDERBAR
マクロは find_rundefsv
を呼び出すようになりました。
dUNDERBAR
は何もしなくなりましたが、過去と将来の互換性のために
まだ残されています。
ibcmp_*
関数は名前が変わり、foldEQ
, foldEQ_locale
,
foldEQ_utf8
と呼ばれます。
古い名前もまだマクロとして利用可能です。
chop
と chomp
の実装がマージされましたchop
および chomp
のオペコードボディと schop
および schomp
の
オペコードボディがマージされました。
実装関数である Perl_do_chop()
と Perl_do_chomp()
(公式 API ではありません) は
マージされ、pp.c の静的関数として移動しました。
これにより Perl バイナリが少し小さくなり、(chomp
が list の値を
渡されたときの副作用の順序に依存していない限り) コアの外側のコードには
一切影響を与えないはずです。
Perl は以下のような警告は出さなくなりました:
$ perl -we 'open(my $f, ">", \my $x); binmode($f, "scalar")' Use of uninitialized value in binmode at -e line 1.
open($fh, ">", \*glob)
経由でグロブリファレンスを開いたとき、
ファイルハンドルに出力されたときにグロブが壊れなくなりました。
これはグロブの内容にアクセスされたときに Perl のクラッシュを
引き起こしていました [perl #77492]。
PerlIO は、シグナルハンドラからのように、再帰的に呼び出されても もはやクラッシュしなくなりました。 今では単にメモリリークします [perl #75556]。
ほとんどの I/O 関数は、"closed" と "unopened" の両方の警告カテゴリが
有効になっていない限り、開いていないハンドルに対して警告を
出していませんでした。
今では(意図していた通り)これらの警告を
出すには use warnings 'unopened'
だけが必要です;
PerlIO 層でいくつかの修正が行われました:
binmode(FH, ":crlf")
が :crlf
層をスタックの一番上にプッシュしたとき、
想定外の結果を引き起こさないように、スタックの下の方にある crlf 層を
有効にしなくなりました [perl #38456]。
:raw
モードでファイルを開くと、単に最上位層を取り除くのではなく、
公表している通りの動作(まずファイルを開き、それから binmode
を
実行する)を実行するようになりました [perl #80764]。
三つの層 :pop
, :utf8
, :bytes
はファイルを開くときに
スタックできませんでした。
例えばこれは:
open(FH, ">:pop:perlio", "some.file") or die $!;
"Invalid argument" エラーを投げていました。 これはこのリリースで修正されました [perl #82484]。
正規表現エンジンは "\N{LATIN SMALL LIGATURE FF}" =~ /f+/i
や
同様の式でもはやループしなくなりました [perl #72998] (5.12.1)。
trie 実行時コードはもはや大量のメモリを割り当てなくなりました; #74484 を修正しています。
(?{...})
ブロック内の文法エラーでももはやパニックメッセージを
引き起こさなくなりました [perl #2353]。
(?:(o){2})?
のようなパターンはもはや "panic" エラーを
引き起こさなくなりました [perl #39233]。
UTF-8 データを処理するときの (.*?)
を含む正規表現での致命的エラーは
修正されました [perl #75680] (5.12.2)。
間違った正規表現エンジンの最適化によって *COMMIT
のような正規表現動詞が
時々無視されていた問題が修正されました。
正規表現の大かっこで囲った文字クラス [\8\9]
は実際には
[89\000]
と同様になっていて、間違って NULL 文字にマッチングしていました。
またこれは間違って 8
と 9
は無視されるという警告が出ていました。
今では [\8\9]
は [89]
と同じになり、\8
と\9
は
認識できないエスケープシーケンスなのでそのまま通すという正しい警告が出ます。
同じスコープにある全体置換 (s///g
) の右側にある正規表現マッチングは、
もはや引き続く反復で間違った値を持つ変数にマッチングしなくなりました。
これは、s|(.)|@a{ print($1), /./ }|g
のように、配列やハッシュの添え字が
右側で展開されたときに起こります [perl #19078]。
Latin-1 の非 ASCII 範囲 (0x80 から 0xFF) の文字は場合によっては
自分自身とマッチングしなかったり、ある文字クラスとその逆クラスの
兵法にマッチングしていたりしていましたが、これは修正されました。
例えば、U+00E2 は \w
と \W
の両方にマッチングしていました
[perl #78464] [perl #18281] [perl #60156]。
(qq{\x{30ab}} =~ /\xab|\xa9/
のように)
前の UTF8 表現の継続バイトとマッチングするような
文字を含む選択に対して Unicode 文字をマッチングすると、
間違った警告を引き起こしていました [perl #70998]。
トライ木最適化は空グループを考慮に入れておらず、"foo" が
/\A(?:(?:)foo|bar|zot)\z/
にマッチングするのを
妨げていました [perl #78356]。
前方参照内に +
を含むパターンは時々 (例えば /(?=(\S+))/g
のような)
グローバルマッチングで間違ってマッチングに失敗していました [perl #68564]。
正規表現最適化によって、{n,m}
量指定子付きのマッチングで
マッチングするべきところ、時々失敗していました [perl #79152]。
use locale
の影響下でコンパイルされた大文字小文字を無視する
正規表現マッチングは、パターンやターゲット文字列が内部的に UTF8 で
エンコーディングされているときに、はるかにまともに動作するようになりました。
以前は、このような条件ではロケール性は完全に失われていました。
今では、255 を超える符号位置は Unicode として扱われますが、0 から 255 までは
パターンや文字列が UTF8 でエンコーディングされているかどうかにかかわらず
現在のロケールルールを使って扱われるようになりました。
255/256 の境界をまたぐような稀な大文字小文字を無視するマッチングは
認められません。
例えば、0xFF は 0x178 LATIN CAPITAL LETTER Y WITH DIAERESIS と
大文字小文字なしにマッチングします; 0xFF は現在のロケールでは
LATIN SMALL LETTER Y に含まれず、Perl はロケール中にこの文字が
含まれているかや、ましてやどの符号位置かを知る方法がないからです。
The (?|...)
正規表現構造は、最後の枝がその他の枝よりも多い捕捉かっこの
集合を持つ場合にクラッシュしていました。
これは単一の枝の場合は Perl 5.10.1 で修正されましたが、
これは複数の枝を考慮に入れていませんでした [perl #84746]。
正規表現での {...}
量指定子の実装により、
/((\w+)(?{ print $2 })){2}/
というコードブロックで時々 $2
が
見えなくなるというバグが修正されました [perl #84294]。
when (scalar) {...}
はもはやクラッシュせず、文法エラーを出します
[perl #74114] (5.12.1)。
文字列 eval (foo: eval $string
) の直前のラベルは、もはや eval 内の
最初の文と結びつけられなくなりました [perl #74290] (5.12.1)。
no 5.13.2
形式の no
はもはや機能や (strict のような) プラグマを
有効にしようとしなくなりました [perl #70075] (5.12.2)。
BEGIN {require 5.12.0}
は use 5.12.0
と同様に振る舞うのではなく、
文書化されている通りに振る舞うようになりました。
以前は、BEGIN
ブロック内の require
は間違って
use feature ':5.12.0'
と use strict
の振る舞いを実行していました;
use
だけが文書化されていました [perl #69050]。
Perl 5.12.0 で導入された退行により、my $x = 3; $x = length(undef)
で
$x
が 3
に設定されていました。
$x
は undef
になります [perl #85508] (5.12.2)。
strict "refs" モードがオフのとき、右辺値コンテキストでの %{...}
は
引数が未定義のときには undef
を返します。
Perl 5.12.0 で導入された、keys %{...}
が真偽値として使われるときに
高速化する最適化はこれを考慮に入れておらず、
keys %{+undef}
(および $foo
が未定義のときのand keys %$foo
) は、
strict モードが有効のときにだけエラーになるべきですが、そうでないときも
エラーになっていました [perl #81750]。
定数の畳み込みは、以下のもの
$text =~ ( 1 ? /phoo/ : /bear/)
から以下への変換
$text =~ /phoo/
をコンパイル時に行っていました。
これは $_
に対して正しくマッチングするようになりました [perl #20444]。
UNITCHECK
ブロック内からの (文字列 eval
かモジュール読み込みによる)
Perl コードのパースは、もはやインタプリタをクラッシュさせなくなりました
[perl #70614]。
20 億のスコープをコンパイルした後でももはや文字列 eval
に
失敗しなくなりました [perl #83364]。
U+387 のような、ある種の Unicode 文字に遭遇してもパーサはもはや ハングアップしなくなりました [perl #74022]。
(INIT
のような) Perl の特殊ブロックと同じ名前の定数の定義は
5.12.0 から動作しなくなっていました。
これは修正されました [perl #78634]。
ハッシュキーとして使われるリテラル値へのリファレンス ($hash{\"foo"}
) は、
ハッシュが tie されていても文字列化されていました [perl #79178]。
A closure containing an
if
文に引き続いて定数や変数があるクロージャはもはや定数として
扱われなくなりました [perl #63540]。
state
は属性とともに使えるようになりました。
属性があっても、my
と同じ意味になっていました [perl #68658]。
@$a > 3
のような式は、(>
式の一部ではなく、@
の
オペランドなので) $a
が未定義のときにもはや
"Use of uninitialized value in numeric gt" 警告を出さなくなりました
[perl #72090]。
(任意の式でなく) ハードコードされた数値でパッケージ配列の要素に アクセスすると、その要素がないときにクラッシュしていました。 普通は配列はコンパイル中に自動有効化されますが、型グロブの操作は これを取り除き、以下の二つのケースでクラッシュしていました:
*d = *a; print $d[0]; undef *d; print $d[0];
-C コマンドラインオプションはシェバン行で使われたときに、他のオプションの 後で使えるようになりました [perl #72434]。
The B
モジュールは entertry
に対して B::LOGOP
ではなく
B::OP
を返していました [perl #80622]。
これは B
自身ではなく Perl コアのバグによるものでした。
Perl 5.10.0 では、メソッド検索をより速くするために MRO キャッシュする
(メソッド解決順序、つまり親クラスのリスト; またの名を "isa" キャッシュ)
ための新しい内部機構が導入されました (これにより @ISA
が繰り返し検索する
必要がなくなりました)。
残念ながら、これにはいくつかバグがありました。
そのほとんどは、5.10.0 以前からあった MRO 関係のバグと共に、
今では修正されました:
以下のようなことをするとメソッド解決に間違った影響を与えていました; なぜなら "isa" キャッシュがリセットされなかったり、最終的に 間違ったクラスの一覧となったりしていたからです。 これらは修正されました。
undef *Foo::
)undef *Foo::ISA
)delete $Foo::{ISA}
)*Foo::ISA = \@Bar::ISA
or
*Foo::ISA = *Bar::ISA
) [perl #77238]undef *Foo::ISA
は新しい @Foo::ISA
の配列がキャッシュを
更新しないようになりました。
型グロブの代入は、グロブのスタッシュがもはや存在しないときに
代入されたグロブが ISA
という名前か、代入のどちらかの側にサブルーチンが
含まれているとクラッシュしていました。
mro::get_isarev
経由で Perl にアクセスできる PL_isarev
は、
パッケージが削除されたり、他のクラスの @ISA
からパッケージが
取り除かれたとき、適切に更新されるようになりました。
これにより多くのパッケージがメモリリークなしに作成および
削除できるようになります [perl #75176]。
さらに、型グロブとスタッシュに関する様々なその他のバグが修正されました:
シンボルテーブル(スタッシュ)、型グロブ、サブルーチンの間のリンクとなる 内部ポインタに対していくつかの作業が行われました。 この降下により、スタッシュやスタッシュのエントリの削除 (例えば <%FOO:: = ()>)や、複雑な型グロブとコードリファレンスの別名によって もはやインタプリタをクラッシュさせなくなりました。
グロブのコピーへのリファレンスの代入は、スカラのグロブを 上書きするのではなく、グロブスロットへの代入になりました [perl #1804] [perl #77508]。
ループ中のループ変数のグロブを置き換えるときのバグが修正されました [perl #21469]。 これにより、以下のようなコードでもはやクラッシュしなくなりました:
for $x (...) { *x = *y; }
グロブから PVLV への代入は、普通の文字列へ変換されていました。 今ではこれは正しく動作し、PVLV はグロブを保持できるようになりました。 これは存在しないハッシュや配列の要素がサブルーチンに渡された時に 起きていました:
sub { $_[0] = *foo }->($hash{key}); # $_[0] would have been the string "*main::foo"
また、グロブがtie された配列やハッシュに代入したりそこから返されたり したときにも起きていました [perl #36051]。
Use of uninitialized value $Foo::BAR
を報告しようとするとき、
例えば delete $::{"Foo::"}
のように、問題になっているグローバル変数を
保持しているグロブが元のスタッシュから分離されたときに
クラッシュすることがありました。
これは、このような場合には変数名を報告しないようにすることで
修正されました。
スコープ終了によってローカル化された型グロブが復元している間に、 結果として呼び出されるデストラクタが、解放されているエントリを含む 一貫性のない状態の型グロブを参照することができ、結果として クラッシュすることがありました。 これは以下のようなコードに影響していました:
local *@; eval { die bless [] }; # puts an object in $@ sub DESTROY { local $@; # boom }
グロブのエントリは、デストラクタが呼び出される前に クリアされるようになりました。 これはまた、デストラクタがグロブのエントリを有効化できることを意味します。 それで Perl は再挑戦し、もしエントリが何度も再作成されると "panic: gp_free ..." エラーメッセージを出して die します。
型グロブが解放されたときに、それに付加されているサブルーチンがまだ
他の場所から参照されていると、サブルーチンは同じパッケージで
__ANON__
という名前に代わります(パッケージ名が未定義の場合は
__ANON__
パッケージが使われます)。
これにより、例えばパッケージが削除されたときなどに、パッケージが
自動有効化されていました。
これはもはや起きなくなりました。
__ANON__
パッケージはまた、元のパッケージがもはやシンボルテーブルに
付加されていないときにも使われるようになりました。
これによりいくつかの場合でのメモリリークを防ぎます [perl #87664]。
名前が ::
で終わるようなパッケージ内の、サブルーチンやパッケージ変数は
完全修飾名でアクセスできるようになりました。
"the Unicode Bug" として知られるようになったものはほとんど完全に
このリリースで解決しています。
use feature 'unicode_strings'
(これは use 5.012
以降では自動的に
選択されます) の基では、文字列の内部ストレージ表現はもはや外部の
意味論に影響を受けません [perl #58182]。
二つの知られている例外があります:
今では非推奨となった、ユーザー定義の大文字小文字変換関数は、操作するのに utf8-エンコードされた文字列を要求します。 CPAN モジュール Unicode::Casing が欠点なしにこの機能を置き換えるために 作成され、この機能は 5.16 で削除することが計画されています。
quotemeta()
(およびインラインで等価な \Q
) も、文字列が UTF-8 で
エンコーディングされているかどうかに依存して異なる結果を返します。
perlunicode/The "Unicode Bug" を参照してください。
Unicode 非文字符号位置の扱いが変更されました。 以前は、これらの 66 のうちの一つが一部の場所で知られていることを除けば、 これらはほとんど不正であると考えられていました。 Unicode 標準はこれら全ては有効であるけれども、"open interchange" を 妨げるものであると考えられています。 これは、どのような符号位置でも内部利用できるようにする変更の一部です (コアの拡張 を参照してください)。 同時に、これらの変更は [perl #38722], [perl #51918], [perl #51936], [perl #63446] を解決します。
複数の文字にマッチングする Unicode 文字への大文字小文字を無視する
"/i"
正規表現は意図通り以上に動作するようになりました。
例えば
"\N{LATIN SMALL LIGATURE FFI}" =~ /ffi/ui
および
"ffi" =~ /\N{LATIN SMALL LIGATURE FFI}/ui
は両方とも真です。 以前は、この機能には多くのバグがありました。 まだ修正されていないものは、パターンに複数の文字が含まれている場所で あるけれども、その文字は以下のように、他のことによって分割されている 場合です
"\N{LATIN SMALL LIGATURE FFI}" =~ /(f)(f)i/ui
または
"\N{LATIN SMALL LIGATURE FFI}" =~ /ffi*/ui
または
"\N{LATIN SMALL LIGATURE FFI}" =~ /[a-f][f-m][g-z]/ui
これらのいずれもマッチングしません。
また、このマッチングはテキストの NFD (Normalization Form Decomposed) の マッチングによるという現在のUnicode 標準を完全には満たしていません。 しかし、これを書いている時点(2010 年 4 月)では、Unicode 標準は このような状況で推奨される動作について今のところ不安定です。 複数文字マッチングという概念全体を放り出すことになるかも知れません [perl #71736]。
非推奨の文字への \N{NAME}
での命名でもはや
メモリリークしなくなりました。
\N{NAME}
構造に引き続いて単一の "."
がある場合に間違って
パースされることによるバグを修正しました [perl #74978] (5.12.1)。
chop
は "\x{7fffffff}"
以上の文字を正しく扱えるようになりました
[perl #73246]。
文字列が内部的に UTF8 でエンコーディングされているときに
index
に文字列の末尾を超えたオフセットを渡してももはや panic を
引き起こさなくなりました [perl #75898]。
warn()
と die()
は utf8-エンコードされたスカラを
認識するようになりました [perl #45549]。
時々 UTF8 の length キャッシュが substr の返り値によってリセットされず、
そのために length(substr($uni_string, ...))
が間違った答えを
返していました。
${^UTF8CACHE}
に -1 をセットしていると、"panic" エラーメッセージも
引き起こしていました [perl #77692]。
オーバーロードは tie された変数と組み合わされたも正しく 動作するようになりました。 以前起きていたのは、ほとんどの op は引数のオーバーロードのチェックを マジックのチェックの 前に 行っていたので、例えば tie された 配列アクセスによって返されたオーバーロードされたオブジェクトは 普通はオーバーロードされていないものとして扱われていました [RT #57012]。
tie された変数に対して、(tie メソッドのような) さまざまな種類のマジックを 呼び出す回数が多すぎたり少なすぎたりする問題が修正されました:
$tied->()
はいつも呼び出されませんでした FETCH [perl #8438]。
ファイルテスト演算子と y///
と tr///
は FETCH を呼び出す回数が
多すぎました。
=
演算子は、もしスカラがたまたま型グロブを保持していた場合
(もし型グロブが tie スカラから返されたり代入されたりした最後のものだった
場合)、右側のマジックを無視していました [perl #77498]。
デリファレンス演算子は、もし引数が (以前の FETCH からのように) すでにリファレンスで合った場合にマジックを無視していました [perl #72144]。
splice
は set-magic を呼び出すようになりました (それで
splice @ISA
はメソッド呼び出しに尊重されるように変更されました)
[perl #78400]。
open($fh, ">", \$buffer)
によって作成されたインメモリファイルは
FETCH/STORE を全く呼び出していませんでした [perl #43789] (5.12.2)。
utf8::is_utf8() は ($1
と同様) get-magic を尊重します (5.12.1)。
交換可能でない 2 項演算子は、もし同じ tie されたスカラが両方の
オペランドに使われていて、それぞれの FETCH で異なった値が返されると、
オペランドを交換していました。
例えば、もし $t
が 1 回目は 2 を返し、2 回目に 3 を返していた場合、
$t/$t
は 1.5 と評価していました。
これは修正されました [perl #87708]。
文字列の eval
は、オーバーロードされたり tie された引数の汚染を
検出するようになりました [perl #75716]。
文字列の eval
と文字列をオーバーロードしているオブジェクトに対して
マッチングしている正規表現は、もはやメモリ破壊やクラッシュを引き起こさなく
なりました [perl #77084]。
readline は <>
のオーバーロードや
tie された引数に対応しました。
<expr>
は、式がオーバーロードされている場合は常にオーバーロードを
尊重するようになりました。
"< as >> glob" は 5.6 以降 "< as >> filehandle" とは
異なったパースが行われるので、<$foo[0]>
のようなものは、
たとえ $foo[0]
がオーバーロードされたオブジェクトでも、
オーバーロードを扱えませんでした。
これは overload の文書に反しており、<>
は一般的な
オーバーロードされた反復子演算子として使えないことを意味していました。
2 項演算子でのオーバーロードのフォールバックの振る舞いは非対称でした [perl #71286]。
main パッケージの変数に適用されるマジックはもはや他のパッケージに 影響を与えなくなりました。 上述の main パッケージ外のマジカル変数 を 参照してください [perl #76138]。
時々、変数に付いているマジック (tie や汚染など) によって、 本来あるべきよりも長い間オブジェクトを存続させたり、tie 変数が tie メソッド内で解放された時にクラッシュを引き起こしたりしていました。 これらは修正されました [perl #81230]。
tie を実装しているオブジェクトの DESTROY メソッドは、tie された変数に 弱い参照によってアクセスされてももはやクラッシュしなくなりました [perl #86328]。
マッチングした変数が kill するプロセス ID に使われたときの kill()
の
退行が修正されました [perl #75812]。
$AUTOLOAD
は、一度汚染されると、永遠に汚染されたままになっていました。
オーバーロードされたメソッドが呼び出され、そのメソッド名が汚染されていない
場合は、正しく汚染が除去されるようになりました。
sprintf
は、フォーマットとして汚染されたスカラが渡されると die するように
なりました。
すでに任意の式では die していましたが、単純なスカラでは die して
いませんでした [perl #82250]。
lc
, uc
, lcfirst
, ucfirst
は、引数が汚染されているときに
もはや汚染されていない文字列を返さなくなりました。
これは perl 5.8.9 から壊れていました [perl #87336]。
Perl デバッガは汚染モードでも動作するようになりました [perl #76872]。
サブルーチンの再定義は再びデバッガで動作するようになりました [perl #48332]。
シェバン(#!
) 行で -d が使われたとき、デバッガはメインプログラムの
行にアクセスするようになりました。
以前は、これはメモリ配置の順番に依存して、動作したり動作しなかったり
していました [perl #71806]。
@DB::args
を設定するのに caller() を
使ったときのメモリリークの可能性が修正されました (5.12.2)。
$^P
が代入されたとき、すでに $DB::single
, $DB::trace
,
$DB::signal
に値が入っている時には、値を変更しなくなりました
[perl #72422]。
文字列 eval 中の #line
指示子は、デバッガ(あるいはデバッグや
プロファイリング用のモジュール)が使っているコードの行の配列
(@{"_< ..."}
) を正しく更新しsていませんでした。
スレッドビルドでは、これらは全く更新されていませんでした。
非スレッドビルドでは、行番号が無視されていたので、すでに存在している
行番号の変更では行番号の間違いを引き起こしていました
[perl #79442]。
子スレッドを作るときに、親のアクティブなスタックフレーム内のスコープ内の レキシカルを間違ってクローン化しなくなりました [perl #73086]。
スレッド化 Perl インタプリタのクローン化と解放でのいくつかの メモリリークが修正されました [perl #77352]。
ディレクトリハンドルが開いているときに新しいスレッドを作成すると、 ハンドルはクローン化されずに単に新しいスレッドに渡されていたために、 二重解放が起こってクラッシュしていました。
Windows や fchdir
関数があるシステムではディレクトリハンドルは
正しくクローン化されるようになりました。
その他のシステムでは、新しいスレッドは単にディレクトリハンドルを
親スレッドから継承しなくなりました [perl #75154]。
The typeglob *,
, which holds the scalar variable
スカラ変数 $,
(出力フィールドセパレータ) を保持している型グロブ
*,
は子スレッドで間違った参照カウントを持っていました。
[perl #78494] スレッド間でパイプが共有されたとき、close
関数
(およびスレッド終了時のような暗黙のクローズ) はブロックしなくなりました。
Perl は、SV が新しいスレッドにクローン化されたけれども親がいなくなっている (つまり、この所有者はクローン化 されなかった) ことを発見した場合、 定期的に SV を掃除します。 これは、スレッドを結合したときのいくつかの "scalars leaked" 警告を 除去します。
左辺値サブルーチンは再びコピーオンライトスカラを返せるようになりました。 これはバージョン 5.10.0 で壊れていました [perl #75656] (5.12.3)。
require
は、呼び出された require
のスコープと、より高いその他の
スコープで同じファイル名があるときに、もはや caller
が間違った
ファイル名を返さなくなりました [perl #68712]。
($$)
プロトタイプを持つ比較ルーチンを使う sort
は、
@_
の値をソート処理外に漏らしていました。
ソートルーチン内で @_
のリファレンスを取ると、クラッシュを
引き起こしていました [perl #72334]。
($1
のような) マッチング変数はソートサブルーチンの呼び出しの間で
もはや持続しなくなりました [perl #76026]。
左辺値サブルーチンから返された配列に対する foreach
による
反復が動作するようになりました [perl #23790]。
$@
は、離れたところでの行動を防ぐために、binmode
の呼び出しの間は
ローカル化されるようになりました [perl #78844]。
クロージャプロトタイプ(クロージャのために属性ハンドラに渡されるもの) を 呼び出すと、クラッシュせずに "Closure prototype called" エラーメッセージが 出力されるようになりました [perl #68560]。
文字列 eval
内のスコープから読み込み専用レキシカル変数に触れると、
変数が書き込み可能になっていました [perl #19135]。
シグナルハンドル内では、$!
は暗黙にローカル化されるようになりました。
CHLD シグナルは、先に POSIX::sigprocmask
によってブロックされていた
場合、シグナルハンドラの後でもはやブロック解除されなくなりました
[perl #82040]。
シグナルハンドラ内でシグナルハンドルが呼び出されると、リークや二重解放を 引き起こしていました。 これは修正されました [perl #76248]。
XS モジュールを読み込むときのいくつかのメモリリークが修正されました (5.12.2)。
substr(), pos(), keys(), vec() は、左辺値と組み合わせて 使われたとき、操作したスカラ値をメモリリークし、デストラクタの実行が 遅すぎることになっていました。 これは修正されました。
ポストインクリメント演算子とポストデクリメント演算子(++
と --
) は
リファレンスに使われるとメモリリークを起こしていました。
これは修正されました。
ネストした map
と grep
のブロックは、大きなリストを処理しても
もはやメモリリークしなくなりました [perl #48004]。
use VERSION
と no VERSION
はもはやメモリリークしなくなりました
[perl #78436] [perl #69050]。
.=
に引き続いて <>
や readline
があると、
$/
に 8 進数の範囲を超えた文字が含まれていて、代入するスカラが
内部的に UTF8 でエンコーディングされている場合にメモリリークしていました
[perl #72246]
eval 'BEGIN{die}'
は非スレッド化ビルドでもメモリリークしなくなりました。
glob()
は、%File::Glob::
が空で、CORE::GLOBAL::glob
が
存在しないときでももはやクラッシュしなくなりました [perl #75464] (5.12.2)。
readline()
は、シグナルで中断されなくなり、もはや以前と「同じもの」を返したり
ランダムなメモリを返したりしなくなりました。
複製されたキーを持つリストをハッシュに代入したとき、代入によって ゴミや解放された値を返していました:
@a = %h = (list with some duplicate keys);
これは修正されました [perl #31865]。
グロブでオブジェクトを解放する機構は解放した SV に繋がっていない ポインタを残したままにしていたので、デストラクタ中に壊れた状態を 見ることが可能でした。
Perl は GV 自身を解放するのではなく、 GV で影響のあるスロットのみを 解放するようになりました。 これにより、デストラクタ中に繋がっていない参照や壊れた状態が 見えないようになりました。
インタプリタは、深くネストした配列の配列の解放したときにもはや クラッシュしなくなりました。 ハッシュはまだ修正されていません [perl #44225]。
use encoding
の基で長い文字列を結合してもクラッシュしなくなりました
[perl #78674]。
import メソッドのないクラスの ->import
呼び出しでスタックが壊れ、
おかしな振る舞いを見せていました。
例えば、
push @a, "foo", $b = bar->import;
これは "foo" を $b
に代入していました [perl #63790]。
recv
関数は、MSG_TRUNC フラグ付きで呼び出されたときに
クラッシュすることがありました [perl #75082]。
formline
は汚染されたフォーマットピクチャーを渡されたときに、もはや
クラッシュしなくなりました。
また、引数が汚染されているときには $^A
も汚染されるようになりました
[perl #79138]。
ファイルテスト操作の処理でのバグによりセグメンテーションフォールトが
起きていました。
ファイルテストは常に op がスタック上にあることを想定しないので、
_
ファイルハンドルを stat
したのではないことが分かっているときにだけ
TOP を使うようになりました。
これは (ck_ftst でチェックされる) OPf_KIDS
によって示されます
[perl #74542] (5.12.1)。
unpack()
は、スカラコンテキストでの %32H
と %32u
がクラッシュする
可能性がある問題が修正され、正しく扱えるようになりました。
split()
は、スタック上の 3 番目のアイテムが想定している正規表現では
ないことによってクラッシュしていました。
unpack("%2H", ...)
は unpack("%2u", ...)
のように、unpack された
結果とスタック上のチェックサムの両方を返していました
[perl #73814] (5.12.2)。
&
, |
, ^
ビット単位演算子は読み込み専用引数を強制しなくなりました
[perl #20661]。
"-0.0" を含むスカラの文字列化は、もはや偽を真に変える効果を 持たなくなりました [perl #45133]。
一部の数値演算子は整数を浮動小数点数に変換して、結果として 64-ビット プラットフォームでは精度が落ちていました [perl #77456]。
sprintf()
は、定数引数で呼び出されるとロケールを無視していました
[perl #78632]。
sprintf
で ベクトル (%v
) フラグと動的精度を結合すると、引数の順序を
混乱して、文字列を精度として扱ったりその逆になったりしていました
[perl #83194]。
C-レベルの lex_stuff_pvn
関数は、最後のセミコロンがない場合、時々
ファイルの最後の行で間違った文法エラーを出すことがありました
[perl #74006] (5.12.1)。
eval_sv
と eval_pv
の C 関数は、文法エラーがあって
G_KEEPERR
フラグがないときに $@
を正しく設定するようになり、
G_KEEPERR
フラグがあるときには設定しなくなりました [perl #3719]。
XS マルチコール API は、サブルーチン内からマルチコールインターフェースで 呼び出されたときにサブルーチンの参照カウントを失っていました。 これは List::Util のようなモジュールに影響していました。 最初の引数としてアクティブなサブルーチンを指定してこれらの関数を 呼び出すとクラッシュを引き起こしていました [perl #78070]。
XS モジュールで利用可能な SvPVbyte
は、ワイド文字に関する
警告を避けるために、SV が降格する前にマジックを呼び出すようになりました
[perl #72398]。
XS バインディングのための typemap の ref 型はマジカル変数に 対応しました [perl #72684]。
sv_catsv_flags
が、渡されたフラグに SV_GMAGIC が含まれていない
ときには 2 番目の引数 (ソース文字列) に mg_get
呼び出さなくなりました。
これで文書と一致します。
my_strftime
はもはやメモリリークしなくなりました。
この修正は POSIX::strftime
のメモリリークを修正します [perl #73520]。
XSUB.h は PERL_IMPLICIT_SYS のときに正しく fgets を再定義するように なりました [perl #55049] (5.12.1)。
Windows で fputc()
あるいは fputs()
を使った XS コードは、引数が
入れ替わることによりエラーを引き起こすことがありました
[perl #72704] (5.12.1)。
デフォルト typemap T_PTROBJ
でセグメンテンションフォールトが
起きる可能性があった問題が修正されました (5.12.2)。
XS のデストラクタから "call_sv(code, G_EVAL)
" が呼び出されたときに
"Unknown error
" が起きることがあるバグが修正されました (5.12.2)。
これは、以前のバージョンの Perl からの退行や、広く使われている CPAN モジュールに影響する、重要な未解決問題の一覧です。
List::Util::first
は、レキシカルな $_
(典型的には my $_
や、
暗黙に given
によって起こります) があると間違った振る舞いをします。
それぞれの反復のために準備している変数はパッケージ変数の $_
であって、
レキシカルな $_
ではありません。
同様な問題は、以下のように、ブロックを最初の引数に取る関数を提供している その他のモジュールにも起こります。
foo { ... $_ ...} list
http://rt.perl.org/rt3/Public/Bug/Display.html も 参照してください。
readline()
がシグナルで中断したとき、undef ではなく空文字列を返します。
プロトタイプの扱いの変更は Switch を壊します。 パッチはすでに上流に送信されていて、うまくいけばもうすぐ CPAN に 現れるでしょう。
ExtUtils-MakeMaker-6.57_05 への更新により、CPAN の Module-Install 配布の いくつかのテストが失敗するようになりました。 (具体的には、バージョン 1.00 では 02_mymeta.t テスト 5 と 21; 18_all_from.t テスト 6 と 15; 19_authors.t テスト 5, 13, 21, 29; 20_authors_with_special_characters.t テスト 6, 15, 23 が失敗します。)
VMS では、Time::HiRes
のテストは CRTL の setitimer
実装のバグにより
失敗していました: 以前は、タイマーの値は時間切れになると
クリアされていましたが、もしタイマーが時間切れになる前にリセットされると
クリアされませんでした。
HP OpenVMS Engineering はこの問題を修正し、後日パッチをリリースします
(Quix case # QXCM1001115136)。
VMS では、以前は成功していた Module::Build
のテストの一部が
失敗するようになっています; CPAN の更新を見守ってください。
keys()
, values()
, each()
は配列でも動作しますkeys()
, values()
, each()
組み込み関数を配列に対しても使えるように
なりました(以前はハッシュに対してしか使えませんでした)。
詳しくは perlfunc を参照してください。
これは実際には perl 5.12.0 で導入されましたが、このリリースの
perl5120delta から漏れていました。
split()
と @_
split()
はスカラコンテキストや無効コンテキストで呼び出されたときに
@_
を変更されなくなりました。
無効コンテキストでは "Useless use of split" 警告が出ます。
これは perl 5.12.0 でも変更されていましたが、perldelta から漏れていました。
http://kobesearch.cpan.org/ の作者であり、いくつかのコア Perl ツールチェーンモジュールの貢献者/メンテナである Randy Kobes は肺がんとの闘病の末に 2010 年 9 月 18 日に亡くなりました。 コミュニティは彼の関与によってより豊かになりました。 Perl コミュニティへの彼の貢献は忘れません。 彼は残念なことでした。
Perl 5.14.0 は、Perl 5.12.0 以降、150 人の作者とコミッタによって、 約 3,000 のファイルに 550,000 行以上の変更を加えて、 ほぼ 1 年間開発されてきました。
Perl は、活気のあるユーザーと開発者のコミュニティのおかげで 20 年を超えて繁栄しています。 以下の人々が、Perl 5.14.0 になるための改良に貢献したことが 分かっています:
Aaron Crane, Abhijit Menon-Sen, Abigail, Ævar Arnfjörð Bjarmason, Alastair Douglas, Alexander Alekseev, Alexander Hartmaier, Alexandr Ciornii, Alex Davies, Alex Vandiver, Ali Polatel, Allen Smith, Andreas König, Andrew Rodland, Andy Armstrong, Andy Dougherty, Aristotle Pagaltzis, Arkturuz, Arvan, A. Sinan Unur, Ben Morrow, Bo Lindbergh, Boris Ratner, Brad Gilbert, Bram, brian d foy, Brian Phillips, Casey West, Charles Bailey, Chas. Owens, Chip Salzenberg, Chris 'BinGOs' Williams, chromatic, Craig A. Berry, Curtis Jewell, Dagfinn Ilmari Mannsåker, Dan Dascalescu, Dave Rolsky, David Caldwell, David Cantrell, David Golden, David Leadbeater, David Mitchell, David Wheeler, Eric Brine, Father Chrysostomos, Fingle Nark, Florian Ragwitz, Frank Wiegand, Franz Fasching, Gene Sullivan, George Greer, Gerard Goossen, Gisle Aas, Goro Fuji, Grant McLean, gregor herrmann, H.Merijn Brand, Hongwen Qiu, Hugo van der Sanden, Ian Goodacre, James E Keenan, James Mastros, Jan Dubois, Jay Hannah, Jerry D. Hedden, Jesse Vincent, Jim Cromie, Jirka Hruška, John Peacock, Joshua ben Jore, Joshua Pritikin, Karl Williamson, Kevin Ryde, kmx, Lars Dɪᴇᴄᴋᴏᴡ 迪拉斯, Larwan Berke, Leon Brocard, Leon Timmermans, Lubomir Rintel, Lukas Mai, Maik Hentsche, Marty Pauley, Marvin Humphrey, Matt Johnson, Matt S Trout, Max Maischein, Michael Breen, Michael Fig, Michael G Schwern, Michael Parker, Michael Stevens, Michael Witten, Mike Kelly, Moritz Lenz, Nicholas Clark, Nick Cleaton, Nick Johnston, Nicolas Kaiser, Niko Tyni, Noirin Shirley, Nuno Carvalho, Paul Evans, Paul Green, Paul Johnson, Paul Marquess, Peter J. Holzer, Peter John Acklam, Peter Martini, Philippe Bruhat (BooK), Piotr Fusik, Rafael Garcia-Suarez, Rainer Tammer, Reini Urban, Renee Baecker, Ricardo Signes, Richard Möhn, Richard Soderberg, Rob Hoelz, Robin Barker, Ruslan Zakirov, Salvador Fandiño, Salvador Ortiz Garcia, Shlomi Fish, Sinan Unur, Sisyphus, Slaven Rezic, Steffen Müller, Steve Hay, Steven Schubiger, Steve Peters, Sullivan Beck, Tatsuhiko Miyagawa, Tim Bunce, Todd Rinaldo, Tom Christiansen, Tom Hukins, Tony Cook, Tye McQueen, Vadim Konovalov, Vernon Lyon, Vincent Pit, Walt Mankowski, Wolfram Humann, Yves Orton, Zefram, and Zsbán Ambrus.
これはバージョンコントロール履歴から自動的に生成しているので、
悲惨なほどに不完全です。
特に、Perl 5.14.0 をよりよくするための助けとなった、以前のバージョンの
Perl の問題を報告してくれた(とてもありがたい)貢献者の名前を含んでいません。
全ての Perl の歴史的な貢献者のより完全な一覧はについては、
どうか Perl 5.14.0 配布に含まれている AUTHORS
を参照してください。
このバージョンに含まれている変更の多くは、Perl コアに含まれている CPAN モジュール由来のものです。 私たちは Perl が繁栄するのを助けている CPAN コミュニティ全体に感謝します。
もしバグと思われるものを見つけたら、comp.lang.perl.misc ニュースグループに 最近投稿された記事や http://rt.perl.org/perlbug/ にある Perl バグ データベースを確認してください。 Perl ホームページ、http://www.perl.org にも情報があります。
もしまだ報告されていないバグだと確信したら、そのリリースに含まれている
perlbug プログラムを実行してください。
バグの再現スクリプトを十分小さく、しかし有効なコードに切りつめることを
意識してください。バグレポートは perl -V
の出力と一緒に
perlbug@perl.org に送られ Perl porting チームによって解析されます。
もし報告しようとしているバグがセキュリティに関するもので、公開されている メーリングリストに送るのが不適切なものなら、 perl5-security-report@perl.org に送ってください。 このアドレスは、問題の影響を評価し、解決法を見つけ、Perl が対応している 全てのプラットフォームで問題を軽減または解決するパッチをリリースするのを 助けることが出来る、全てのコアコミッタが参加している非公開の メーリングリストになっています。 このアドレスは、独自に CPAN で配布されているモジュールではなく、 Perl コアのセキュリティ問題だけに使ってください。
変更点の完全な詳細を見る方法については Changes ファイル。
Perl のビルド方法については INSTALL ファイル。
一般的なことについては README ファイル。
著作権情報については Artistic 及び Copying ファイル。