sub
は prototype
属性を取るようになりましたrand
は一貫性のある乱数生成器を使うようになりました\p{Unicode}
正規表現パターン特性use locale
は UTF-8 ロケールで動作するようになりましたuse locale
はロケール機能のないシステムでコンパイルできるようになりました-DL
実行時オプションがロケール設定のトレースに追加されましたdo
はサブルーチン呼び出しに使えなくなりました\p{}
, \P{}
マッチングが変更されました\p{All}
は全ての可能性のある符号位置にマッチングするように拡張されましたuse locale
のスコープの外側にリークしなくなりましたPerlIO_vsprintf
と PerlIO_sprintf
は削除されましたperl5200delta - perl v5.20.0 での変更点
この文書は 5.18.0 リリースと 5.20.0 リリースの変更点を記述しています。
5.16.0 のような以前のリリースから更新する場合は、まず 5.16.0 と 5.18.0 の違いについて記述している perl5180delta を読んでください。
引数リストをレキシカル変数に展開するための宣言的な文法です。 sub foo ($a,$b) {...}
は引数の数をチェックし、引数をレキシカル変数に 設定します。 シグネチャは既にある慣用句である sub foo { my($a,$b) = @_; ... }
と 等価ではありません。 シグネチャは非デフォルト機能を有効にしたときにのみ利用可能で、 実験的であるという警告が生成されます。 プロトタイプとの文法的な衝突は、シグネチャが有効の時に短いプロトタイプ文法は 無効にされることで制御されます。
詳しくは "Signatures" in perlsub を参照してください。
sub
は prototype
属性を取るようになりましたsub
を宣言または定義するとき、プロトタイプを、名前の後ろのかっこの中ではなく prototype
属性の内側に指定できるようになりました。
例えば、sub foo($$){}
は sub foo : prototype($$){}
と書き直せます。
サブルーチンプロトタイプでの複数のセミコロンは許容されていて、単一の セミコロンとして扱われていました。 これが起きない場合が一つあります。 "*" または ";*" で始まるプロトタイプのサブルーチンは、裸の単語がメソッド名や サブルーチン呼び出しとして扱われるかどうかに影響します。 これは ";;;*" にも適用されるようになりました。
サブルーチンプロトタイプの内側の空白は長い間認められていたので、 sub( $ $ )
は sub($$)
と等価ですが、今までこれはサブルーチンが パースされるときには取り除かれていました。 従って、空白は Scalar::Util::set_prototype
で設定されているプロトタイプでは 認められていません でした。 これは認められるようになり、パーサは空白を取り除かなくなりました。 つまり、prototype &mysub
は空白を含む元のプロトタイプそのものを 返すようになりました。
rand
は一貫性のある乱数生成器を使うようになりました以前の perl はプラットフォームに固有の乱数生成器を使っており、 libc rand(), random(), drand48() のように様々でした。
つまり、perl の乱数の品質はプラットフォームによって異なり、 Windows での rand() の 15 ビットから drand48() のある Linux のような POSIX プラットフォームでの 48 ビットまで様々でした。
perl は全てのプラットフォームで独自の内部の drand48() 実装を 使うようになりました。 これで perl の rand
が暗号学的に安全になったわけではありません。 [perl #115928]
新しい %hash{...}
と %array[...]
の文法はキー/値 (または インデックス/値)の組のリストを返します。 "Key/Value Hash Slices" in perldata を参照してください。
postderef
機能が有効のとき、以下の文法的等価物が設定されます:
$sref->$*; # ${ $sref } と同じ # 変数展開
$aref->@*; # @{ $aref } と同じ # 変数展開
$href->%*; # %{ $href } と同じ
$cref->&*; # &{ $cref } と同じ
$gref->**; # *{ $gref } と同じ
$aref->$#*; # $#{ $aref } と同じ
$gref->*{ $slot }; # *{ $gref }{ $slot } と同じ
$aref->@[ ... ]; # @$aref[ ... ] と同じ # 変数展開
$href->@{ ... }; # @$href{ ... } と同じ # 変数展開
$aref->%[ ... ]; # %$aref[ ... ] と同じ
$href->%{ ... }; # %$href{ ... } と同じ
「変数展開」とマークされているものは、関連する postderef_qq
機能も 有効にされている場合にのみ展開されます。 この機能は 実験的 で、抑制しない限り、使ったときに experimental::postderef
カテゴリの警告を引き起こします。
さらなる詳細については、the Postfix Dereference Syntax section of perlref を参照してください。
Perl は Unicode 6.3 に対応し、これと共に出荷されています (しかし、Perl は 任意の以前の Unicode リリースでも再コンパイルできます)。 Unicode 6.3 の変更の詳細な一覧は http://www.unicode.org/versions/Unicode6.3.0/ にあります。
\p{Unicode}
正規表現パターン特性これは \p{Any}
の同義語で、Unicode で定義された符号位置 0 - 0x10FFFF の 集合にマッチングします。
64 ビットプラットフォームでは、内部配列関数は 64 ビットのオフセットを 使うようになったので、メモリがあれば、Perl で 2**31 要素以上の配列を 保持できるようになりました。
正規表現エンジンは 2**31 文字以上の長さの文字列に対応しました。 [perl #112790, #116907]
関数 PerlIO_get_bufsiz, PerlIO_get_cnt, PerlIO_set_cnt, PerlIO_set_ptrcnt は 返り値と引数に int ではなく SSize_t を使うようになりました。
use locale
は UTF-8 ロケールで動作するようになりましたこのリリースまで、ISO 8859 のような単一バイトロケールのみが対応していました。 今回、次第に一般的になってきている複数バイト UTF-8 ロケールも対応しました。 UTF-8 ロケールは、文字集合が Unicode でエンコーディングが UTF-8 です。 このロケールでの POSIX LC_CTYPE
カテゴリの操作 ((lc()
, "\U"
のような) 大文字小文字変換と(\w
, \D
, qr/[[:punct:]]/
のような)文字クラス化) は 単にロケールが有効でないかのように動作しますが、汚染ルールに従う以外は use feature 'unicode_strings'
が有効であるかのように動作します。 このリリースではソートは符号位置順のままです。 [perl #56820]。
use locale
はロケール機能のないシステムでコンパイルできるようになりました以前はこれをするとプログラムがコンパイルされませんでした。 そのスコープの中ではプログラムは "C" ロケールのように振る舞います。 従ってロケールに対応しているプラットフォームのために書かれたプログラムは ロケールのないプラットフォームでも変更なしで動作します。 ロケールを "C" ロケールから変えようとすると、もちろん失敗します。
Perl 起動時にロケールでエラーがあると、すぐに諦めて "C"
ロケールを 使おうとしていました。 これは、"ENVIRONMENT" in perllocale で詳しく書かれているように環境変数によって 指定されたその他のロケールを使おうとするようになりました。 例えば、LC_ALL
と LANG
の両方が設定されていて、LC_ALL
ロケールの 使用に失敗すると、Perl は LANG
ロケールを使うことを試みるようになり、 それが失敗した場合にのみ "C"
にフォールバックします。 Windows マシンでは、環境変数で指定された全てのロケールが失敗すると、 "C"
を使う前に、システムデフォルトのロケールを試みます。
-DL
実行時オプションがロケール設定のトレースに追加されましたこれは、Perl コア開発者がロケールに関するバグをデバッグする助けになるように 設計されています。
以前は -a なしの -F は効果なしで、-n または -p なしの -a も 効果なしでした; この変更により、-F を指定すると -a と -n が暗黙に 指定され、-a を指定すると -n が暗黙に指定されます。
追加の振る舞いのために -p を使うこともできます。 [perl #116190]
sort
で使われる特殊変数 $a と $b は、例え sort
が使われていなくても "used once" 警告を免れるようになりました。 これにより、CPAN モジュールが同様の目的で $a と $b を使う関数を提供するのが より容易になります。 [perl #120462]
ヒヤドキュメントで終わっていてファイルの最後の行が改行文字で 終端されていないという普通でない状況の Perl プログラムのパース中に、 free() されたメモリが読み込まれる可能性がありました。 これは修正されました。
do
はサブルーチン呼び出しに使えなくなりましたdo SUBROUTINE(LIST)
形式は Perl v5.0.0 から廃止予定警告が出ていましたが、 文法エラーになりました。
ダブルクォート文字列 ("..." や qq(...)) の中の \c
の後の文字は、{
以外の 表示文字でなければならなくなりました。
\B
または \b
の後のリテラルな {
は致命的になりました。
これらは perl v5.14.0 から廃止予定になっています。
これは、use locale
スコープ内での正規表現マッチングと文字列の 大文字小文字変換 (lc
, "\U"
など) に影響します。 結果は、文書 (perlsec, "SECURITY" in perllocale) が示しているように、 文字列の内容に関わらず、操作を基にして汚染されるようになりました。 以前は、大文字小文字変換操作については、ロケールによって影響を受けるかも 知れない大文字小文字変換が行われる文字が文字列に含まれていないときは、 結果は汚染されていませんでした。 例えば、空文字列や、Latin1 以上の符号位置のみが含まれている文字列に対する uc()
の結果は、以前は汚染されていませんでしたが、 汚染されるようになりました。 これにより、より一貫性のある汚染結果となります。 正規表現パターンは、($&
, $2
のような) 非 2 値の結果について、 パターンに(汚染されているかも知れない)現在のロケールに依存するマッチングを 含んでいる場合にのみ、汚染します。 大文字小文字変換関数のように、マッチングされる文字列の実際の内容は、 以前は関係していましたが、関係なくなりました。 例えば、パターンに \w
が含まれている場合、たとえマッチングがパターンの 一部が成功したかどうかを使う必要がなくても、結果は汚染されます; なぜなら \w
がマッチングするものはロケールに依存するからです。 しかし、例えば、パターン中の .
は汚染を有効にしません; なぜならドットは 任意の単一文字にマッチングし、現在のロケールは何にマッチングし何に マッチングしないかに影響を与えないからです。
\p{}
, \P{}
マッチングが変更されました\p{}
と \P{}
は Unicode が定義した符号位置 (U+0000
から U+10FFFF
) のみに対して Unicode によって定義されています。 正当な Unicode 符号位置に対するマッチングの振る舞いに変更はありませんが、 0x110000
以上の符号位置には変更があります。 以前は、Perl はこれらに対する \p{}
や \P{}
のマッチングは undef
として扱い、「偽」に解釈していました。 \P{}
については、これは「真」に補完されてました。 これが起きると警告が発生すると想定されていました。 しかし、様々な最適化がこの警告を妨げることがあり、結果はしばしば直感に反して、 マッチングとその補完の両方で偽になっていました。 全ての非 Unicode 符号位置は典型的な未割り当て Unicode 符号位置として 扱われるようになりました。 これは一般的には、より空気を読むようになります。 警告は、厳密な Unicode の手法と Perl が行っていた手法で結果が明らかに 異なる場合にのみ発生します。 厳密に Unicode に準拠する必要があるコードではこの警告を致命的にでき、 それから Perl は常に警告を発生させます。
詳細は "Beyond Unicode code points" in perlunicode にあります。
\p{All}
は全ての可能性のある符号位置にマッチングするように拡張されましたPerl が定義した、CPAN で使われていない正規表現パターン要素 \p{All}
は、 単に Unicode 符号位置とマッチングするために使われていました; これは 全ての符号位置にマッチングするようになりました; つまり、これは qr/./s
と 等価です。 従って、\p{All}
はもはや、Unicode が言っているように単に Unicode 符号位置に マッチングする \p{Any}
の別名ではありません。
ダンプされるデータ構造と Data::Dumper の設定に依存して、ダンプされた 出力は以前のバージョンと変わる可能性があります。
Data::Dumper の正確な出力に依存したテストがある場合、失敗するかもしれません。
この問題を避けるためには、ダンプそのものではなく、ダンプされた構造を 評価したデータ構造に対してテストしてください。
use locale
のスコープの外側にリークしなくなりましたこれは実際にはバグ修正ですが、このバグが存在していることに依存している コードがあるので、この変更はここに書かれています。 プログラムが実行されている現在のロケールは、use locale
スコープの 内側でない限り Perl コードから見えないことになっています。 しかし、今まで一部の状況では、小数点に使われる文字 (しばしばカンマ) は スコープの外側にリークしていました。 コードがこの変更によって影響を受ける場合は、単に use locale
を 加えてください。
以前のバージョンの Perl では、WSAGetLastError() から返された Windows の ソケットエラーコードは $! に代入され、VC++ (および gcc の様々な Windows 版) の errno.h にない ECONNABORTED のような一部の定数は、$! が Errno と POSIX によってエクスポートされている E* 定数に対してテスト出来るように、 対応する WSAE* の値として定義されていました。
これは、perl によって WSAE* の値に(再)定義されている部分を含む、> 100 の 値を持つ新しい E* 定数が errno.h 導入された VC++ 2010 まではうまく 動作していました。 これは、XS コードを、errno.h 定数の本来の定義を使っている他のライブラリと リンクするときに問題を引き起こします。
この非互換性を避けるために、perl は、可能なところでは WSAE* エラーコードを E* 値にマッピングして、その値を $! に代入します。 Errno および POSIX からエクスポートされる E* 定数は、$! とのテストが、 以前可能であったかどうかに関わらず、想定通りに動作し続けるように更新され、 errno.h にある全てのl E* 定数は、これらのモジュールから、元の errno.h の 値でエクスポートされるようになりました。
WSAE* の値を $! に代入している既存の Perl コードが壊れるのを防ぐために、 perl は代入に介入して、$! 自身に代入するときに内部で使われるのと同じように E* へのマッピングを行います。
しかし、後方非互換性が一つ残っています: 以前 $! に代入されていた WSAE* エラーコードの数値と $! を比較する既存の Perl コードは、代わりに 対応する E* 値が代入される場合に壊れます。 これは、< 100 の E* 値にのみ問題になります; これは Errno と POSIX から常に元の errno.h の値から エクスポートされるので、WSAE* エラーコードのテストには使えません (例えば WSAEINVAL は 10022 ですが、対応する EINVAL は 22 です)。 (> 100 である E* 値がもしあれば、どちらにしろ WSAE* 値に再定義されるので、 互換性は E* 定数を使うことで達成され、内部で異なった数値が 使われていたとしても、この変更の前後両方で動作します。)
PerlIO_vsprintf
と PerlIO_sprintf
は削除されましたこれら二つの、文書化されておらず、CPAN で使われておらず、問題のある関数は 削除されました。
/\C/
文字クラス/\C/
正規表現文字クラスは廃止予定です。 perl 5.22 以降これは警告を生成し、perl 5.24 以降これは正規表現コンパイラの エラーになります。 UTF8 エンコードされた文字を装っている個々のバイトを調べる必要がある場合は、 文字列(またはそのコピー)に対してまず utf8::encode()
を使ってください。
この廃止予定は、(NAK
や NEGATIVE ACKNOWLEDGE
文字のような) $\cT (\cT は ソースコード中のリテラルな制御文字) のようなものに影響します。 驚くべきことに、本来これは $^T のような、キャレット形式のみが代替策として 追加されている変数にアクセスする正当な方法を意図していたようです。
リテラル制御文字形式は主に二つの理由で廃止予定です。 これには、$\cI が $^I の別名として動作しないといったおそらく修正できない バグがあり、またこれらの使用は非 ASCII プラットフォームで移植性がありません: $^T はどこでも動作する一方、\cT は EBCDIC では空白です。 [perl #119123]
$/
の、整数でなかったり正の整数でないリファレンス$/
をゼロへのリファレンスや負数へのリファレンスに設定するのは 廃止予定になり、undef
に設定されたのと 正確に 同じように振る舞います。 吸い込みの振る舞いが必要なら、$/
に明示的に undef
を設定してください。
$/
に非整数へのリファレンスを設定するのは禁止されることになり、エラーが 投げられます。 Perl がこの文脈で何が起こるかを文書化されたことはなく、$/
にリファレンスの アドレスを設定したのと同じように振る舞っていた一方、将来異なった振る舞いを するかもしれないので、この使用法を禁止することにしました。
POSIX
モジュールの以下の関数の使用は廃止予定になりました: isalnum
, isalpha
, iscntrl
, isdigit
, isgraph
, islower
, isprint
, ispunct
, isspace
, isupper
, and isxdigit
。 これらの関数はバグがあって、UTF-8 エンコードされた文字列では動作しません。 さらなる情報については POSIX のそれぞれのエントリを参照してください。
警告は、これらが呼び出されたコードの位置それぞれについて最初の呼び出しで 発生します。 (従って、ループ中で繰り返し呼び出されても一回だけ警告が発生します。)
Perl によって提供されている「インタプリタベースのスレッド」は、想定されたり 望まれたりしているかもしれないような、マルチタスクのための高速で軽量な システムではありません。 スレッドは、誤用しやすい方法で実装されています。 これを正しく使う方法を知っている人や、助けを提供できる人はほとんどいません。
perl でのインタプリタベースのスレッドは公式に 非推奨 です。
以下のモジュールは将来のリリースのコア配布から削除される予定で、 その時点で CPAN からインストールする必要があるようになります。 これらのモジュールが必要な CPAN 配布はこれらを必要条件に指定する必要が あります。
このことを知らせるために、これらのモジュールのコア版は "deprecated"
カテゴリ警告が出るようになります。 この廃止予定警告を黙らせるには、問題のモジュールを CPAN から インストールしてください。
これらのモジュールのコアからの削除計画は、コードの品質に関する判定を 反映したものではなく、これらの使用を中止することを推奨していると 受け取るべきでないことに注意してください。 これらのコアからの除去は、その設計を考慮したものではなく、完全な機能の CPAN が利用可能な Perl のインストールをブートストラップするために必要か どうかで決められています。
以下のユーティリティは、将来のリリースでコア配布から取り除かれる予定で、その 時点から CPAN からインストールする必要があります。
あるスカラから別のスカラに代入するときに内部文字列バッファを コピーする必要を避けるための新しいコピーオンライト機構が導入されました。 これにより大きな文字列のコピーが遥かに高速になりました。 代入の後で二つ(またはそれ以上)の文字列の一つを修正すると内部で強制的に コピーされます。 これにより、効率のために文字列をリファレンスで渡す必要がなくなります。
この機能は既に 5.18.0 から利用可能でしたが、デフォルトでは 有効ではありませんでした。 今回からデフォルトになったので、もはや以下のように Configure 引数に 指定して perl をビルドする必要はありません:
-Accflags=-DPERL_NEW_COPY_ON_WRITE
これは(今回から)perl ビルド時に無効にできます:
-Accflags=-DPERL_NO_COW
一部のオペレーティングシステムでは、複数の SV で共有されている文字列バッファを 変更しようとするとクラッシュするような形で Perl をコンパイルできます。 この方法で XS 作者は自分のモジュールがコピーオンライトスカラを正しく 扱えることをテストできます。 詳しくは "Copy on Write" in perlguts を参照してください。
Perl は正規表現パターンのための最適化器を持っています。 これは、文字列がマッチングするための最小の長さと行ったものを探すために パターンを解析します。 これが Latin1 の範囲を超えた符号位置をよりよくあつかえるようになりました。
^
アンカー (またはその 変形である /m
フラグ) を含む正規表現の実行が、 いくつかの状況でとても早くなりました。
事前計算されたハッシュ値は、メソッド検索中のより多くの場所で 使われるようになりました。
定数ハッシュキーの検索 ($hash{$key}
ではなく $hash{key}
) は、検索を 高速化するために、長い間コンパイル時に計算した内部ハッシュ値を使っていました。 この最適化はハッシュスライスにも適用されるようになりました。
unless ($a && $b)
や if ($a || b)
のような、無効コンテキストでの and
と or
演算子の組み合わせは、文の末尾への直接の短絡となりました。 [perl #120128]
一部の状況で、return
がサブルーチンのメインスコープの最後の文のとき、 最適化して削除されます。 つまり、以下のようなコードは:
sub baz { return $cat; }
以下のように振る舞い:
sub baz { $cat; }
特に高速になります。
[perl #120765]
以下のようなコードは:
my $x; # or @x, %x
my $y;
以下のように最適化されます:
my ($x, $y);
v5.18.0 で導入された padrange 最適化 との 組み合わせで、未初期化 my 変数文も最適化されるので:
my $x; my @y; my %z;
は以下のようになります:
my ($x, @y, %z);
[perl #121077]
配列とハッシュのスライスを含む、ある種のリストの作成がより速くなりました。
小さい整数定数のインデックスの配列の最適化は、0.255 ではなく -128..127 の 範囲の整数に適用されるようになりました。 これにより、(おそらく遥かに稀な) $x[200]
のような式を使ったコードが 遅くなる代わりに、$x[-1]
のような Perl コードは高速化します。
大きなハッシュに対する (keys
や each
を使った) 最初の反復が より速くなりました。 これは、ハッシュの内部反復子状態を、ハッシュが最初に反復したときに 遅延して作るのではなく、予め割り当てることで達成されます。 (小さいハッシュでは、反復子はやはり最初に必要になったときに作られます。 小さいハッシュは、決して割り当てられないオブジェクトとして使われる可能性が 高いという仮定をしています。 大きいハッシュではこれが真である可能性はより低く、反復子を割り当てるコストは ハッシュ自身のための場所を割り当てるコストに飲み込まれます。)
readline
または <>
演算子から来た文字列に対してグローバルな 正規表現マッチングが行われるとき、もはやデータは不必要に コピーされなくなりました。 [perl #121259]
($obj->[0]
や $obj->{k}
などでの) デリファレンスは、 $obj
がオーバーロードされたメソッドを持つクラスのインスタンスだけれども、 @{}
や %{}
などのデリファレンスメソッドはオーバーロードされていないときに より速くなりました。
Perl の最適化器は、ある種の eval {}
式 (明らかな無限ループを含みます)で 最適化コードを飛ばさなくなりました。
実行時に無意味な作業を避けるためによりよい処理をするようになりました。 内部の効果がない "null" 操作 (Perl プログラムのパースの副作用として 作られます) は普通コンパイル時に削除されます。 この削除は、以前は扱われていなかった一部の状況でも適用されるようになりました。
連続した三つまでの範囲の符号位置に対応する Unicode 特性を扱うときの ディスク I/O を削減しました。
experimental 0.007 が Perl コアに追加されました。
IO::Socket::IP 0.29 が Perl コアに追加されました。
Archive::Tar はバージョン 1.90 から 1.96 に更新されました。
arybase はバージョン 0.06 から 0.07 に更新されました。
Attribute::Handlers はバージョン 0.94 から 0.96 に更新されました。
attributes はバージョン 0.21 から 0.22 に更新されました。
autodie はバージョン 2.13 から 2.23 に更新されました。
AutoLoader はバージョン 5.73 から 5.74 に更新されました。
autouse はバージョン 1.07 から 1.08 に更新されました。
B はバージョン 1.42 から 1.48 に更新されました。
B::Concise はバージョン 0.95 から 0.992 に更新されました。
B::Debug はバージョン 1.18 から 1.19 に更新されました。
B::Deparse はバージョン 1.20 から 1.26 に更新されました。
base はバージョン 2.18 から 2.22 に更新されました。
Benchmark はバージョン 1.15 から 1.18 に更新されました。
bignum はバージョン 0.33 から 0.37 に更新されました。
Carp はバージョン 1.29 から 1.3301 に更新されました。
CGI はバージョン 3.63 から 3.65 に更新されました。 注意: CGI は廃止予定で、 将来のバージョンの Perl から削除される予定です。
charnames はバージョン 1.36 から 1.40 に更新されました。
Class::Struct はバージョン 0.64 から 0.65 に更新されました。
Compress::Raw::Bzip2 はバージョン 2.060 から 2.064 に更新されました。
Compress::Raw::Zlib はバージョン 2.060 から 2.065 に更新されました。
Config::Perl::V はバージョン 0.17 から 0.20 に更新されました。
constant はバージョン 1.27 から 1.31 に更新されました。
CPAN はバージョン 2.00 から 2.05 に更新されました。
CPAN::Meta はバージョン 2.120921 から 2.140640 に更新されました。
CPAN::Meta::Requirements はバージョン 2.122 から 2.125 に更新されました。
CPAN::Meta::YAML はバージョン 0.008 から 0.012 に更新されました。
Data::Dumper はバージョン 2.145 から 2.151 に更新されました。
DB はバージョン 1.04 から 1.07 に更新されました。
DB_File はバージョン 1.827 から 1.831 に更新されました。
DBM_Filter はバージョン 0.05 から 0.06 に更新されました。
deprecate はバージョン 0.02 から 0.03 に更新されました。
Devel::Peek はバージョン 1.11 から 1.16 に更新されました。
Devel::PPPort はバージョン 3.20 から 3.21 に更新されました。
diagnostics はバージョン 1.31 から 1.34 に更新されました。
Digest::MD5 はバージョン 2.52 から 2.53 に更新されました。
Digest::SHA はバージョン 5.84 から 5.88 に更新されました。
DynaLoader はバージョン 1.18 から 1.25 に更新されました。
Encode はバージョン 2.49 から 2.60 に更新されました。
encoding はバージョン 2.6_01 から 2.12 に更新されました。
English はバージョン 1.06 から 1.09 に更新されました。
Errno はバージョン 1.18 から 1.20_03 に更新されました。
Exporter はバージョン 5.68 から 5.70 に更新されました。
ExtUtils::CBuilder はバージョン 0.280210 から 0.280216 に更新されました。
ExtUtils::Command はバージョン 1.17 から 1.18 に更新されました。
ExtUtils::Embed はバージョン 1.30 から 1.32 に更新されました。
ExtUtils::Install はバージョン 1.59 から 1.67 に更新されました。
ExtUtils::MakeMaker はバージョン 6.66 から 6.98 に更新されました。
ExtUtils::Miniperl はバージョン 1.01 に更新されました。
ExtUtils::ParseXS はバージョン 3.18 から 3.24 に更新されました。
ExtUtils::Typemaps はバージョン 3.19 から 3.24 に更新されました。
ExtUtils::XSSymSet はバージョン 1.2 から 1.3 に更新されました。
feature はバージョン 1.32 から 1.36 に更新されました。
fields はバージョン 2.16 から 2.17 に更新されました。
File::Basename はバージョン 2.84 から 2.85 に更新されました。
File::Copy はバージョン 2.26 から 2.29 に更新されました。
File::DosGlob はバージョン 1.10 から 1.12 に更新されました。
File::Fetch はバージョン 0.38 から 0.48 に更新されました。
File::Find はバージョン 1.23 から 1.27 に更新されました。
File::Glob はバージョン 1.20 から 1.23 に更新されました。
File::Spec はバージョン 3.40 から 3.47 に更新されました。
File::Temp はバージョン 0.23 から 0.2304 に更新されました。
FileCache はバージョン 1.08 から 1.09 に更新されました。
Filter::Simple はバージョン 0.89 から 0.91 に更新されました。
Filter::Util::Call はバージョン 1.45 から 1.49 に更新されました。
Getopt::Long はバージョン 2.39 から 2.42 に更新されました。
Getopt::Std はバージョン 1.07 から 1.10 に更新されました。
Hash::Util::FieldHash はバージョン 1.10 から 1.15 に更新されました。
HTTP::Tiny はバージョン 0.025 から 0.043 に更新されました。
I18N::Langinfo はバージョン 0.10 から 0.11 に更新されました。
I18N::LangTags はバージョン 0.39 から 0.40 に更新されました。
if はバージョン 0.0602 から 0.0603 に更新されました。
inc::latest はバージョン 0.4003 から 0.4205 に更新されました。
integer はバージョン 1.00 から 1.01 に更新されました。
IO はバージョン 1.28 から 1.31 に更新されました。
IO::Compress::Gzip とその類似モジュールはバージョン 2.060 から 2.064 に 更新されました。
IPC::Cmd はバージョン 0.80 から 0.92 に更新されました。
IPC::Open3 はバージョン 1.13 から 1.16 に更新されました。
IPC::SysV はバージョン 2.03 から 2.04 に更新されました。
JSON::PP はバージョン 2.27202 から 2.27203 に更新されました。
List::Util はバージョン 1.27 から 1.38 に更新されました。
locale はバージョン 1.02 から 1.03 に更新されました。
Locale::Codes はバージョン 3.25 から 3.30 に更新されました。
Locale::Maketext はバージョン 1.23 から 1.25 に更新されました。
Math::BigInt はバージョン 1.9991 から 1.9993 に更新されました。
Math::BigInt::FastCalc はバージョン 0.30 から 0.31 に更新されました。
Math::BigRat はバージョン 0.2604 から 0.2606 に更新されました。
MIME::Base64 はバージョン 3.13 から 3.14 に更新されました。
Module::Build は 0.4003 から 0.4205 に更新されました。 Module::Build は廃止予定で、 将来のバージョンの Perl から 削除される予定です。
Module::CoreList はバージョン 2.89 から 3.10 に更新されました。
Module::Load はバージョン 0.24 から 0.32 に更新されました。
Module::Load::Conditional はバージョン 0.54 から 0.62 に更新されました。
Module::Metadata はバージョン 1.000011 から 1.000019 に更新されました。
mro はバージョン 1.11 から 1.16 に更新されました。
Net::Ping はバージョン 2.41 から 2.43 に更新されました。
Opcode はバージョン 1.25 から 1.27 に更新されました。
Package::Constants はバージョン 0.02 から 0.04 に更新されました。 注意: Package::Constants は廃止予定で、 将来のバージョンの Perl から 削除される予定です。
Params::Check はバージョン 0.36 から 0.38 に更新されました。
parent はバージョン 0.225 から 0.228 に更新されました。
Parse::CPAN::Meta はバージョン 1.4404 から 1.4414 に更新されました。
Perl::OSType はバージョン 1.003 から 1.007 に更新されました。
perlfaq はバージョン 5.0150042 から 5.0150044 に更新されました。
PerlIO はバージョン 1.07 から 1.09 に更新されました。
PerlIO::encoding はバージョン 0.16 から 0.18 に更新されました。
PerlIO::scalar はバージョン 0.16 から 0.18 に更新されました。
PerlIO::via はバージョン 0.12 から 0.14 に更新されました。
Pod::Escapes はバージョン 1.04 から 1.06 に更新されました。
Pod::Functions はバージョン 1.06 から 1.08 に更新されました。
Pod::Html はバージョン 1.18 から 1.21 に更新されました。
Pod::Parser はバージョン 1.60 から 1.62 に更新されました。
Pod::Perldoc はバージョン 3.19 から 3.23 に更新されました。
Pod::Usage はバージョン 1.61 から 1.63 に更新されました。
POSIX はバージョン 1.32 から 1.38_03 に更新されました。
re はバージョン 0.23 から 0.26 に更新されました。
Safe はバージョン 2.35 から 2.37 に更新されました。
Scalar::Util はバージョン 1.27 から 1.38 に更新されました。
SDBM_File はバージョン 1.09 から 1.11 に更新されました。
Socket はバージョン 2.009 から 2.013 に更新されました。
Storable はバージョン 2.41 から 2.49 に更新されました。
strict はバージョン 1.07 から 1.08 に更新されました。
subs はバージョン 1.01 から 1.02 に更新されました。
Sys::Hostname はバージョン 1.17 から 1.18 に更新されました。
Sys::Syslog はバージョン 0.32 から 0.33 に更新されました。
Term::Cap はバージョン 1.13 から 1.15 に更新されました。
Term::ReadLine はバージョン 1.12 から 1.14 に更新されました。
Test::Harness はバージョン 3.26 から 3.30 に更新されました。
Test::Simple はバージョン 0.98 から 1.001002 に更新されました。
Text::ParseWords はバージョン 3.28 から 3.29 に更新されました。
Text::Tabs はバージョン 2012.0818 から 2013.0523 に更新されました。
Text::Wrap はバージョン 2012.0818 から 2013.0523 に更新されました。
Thread はバージョン 3.02 から 3.04 に更新されました。
Thread::Queue はバージョン 3.02 から 3.05 に更新されました。
threads はバージョン 1.86 から 1.93 に更新されました。
threads::shared はバージョン 1.43 から 1.46 に更新されました。
Tie::Array はバージョン 1.05 から 1.06 に更新されました。
Tie::File はバージョン 0.99 から 1.00 に更新されました。
Tie::Hash はバージョン 1.04 から 1.05 に更新されました。
Tie::Scalar はバージョン 1.02 から 1.03 に更新されました。
Tie::StdHandle はバージョン 4.3 から 4.4 に更新されました。
Time::HiRes はバージョン 1.9725 から 1.9726 に更新されました。
Time::Piece はバージョン 1.20_01 から 1.27 に更新されました。
Unicode::Collate はバージョン 0.97 から 1.04 に更新されました。
Unicode::Normalize はバージョン 1.16 から 1.17 に更新されました。
Unicode::UCD はバージョン 0.51 から 0.57 に更新されました。
utf8 はバージョン 1.10 から 1.13 に更新されました。
version はバージョン 0.9902 から 0.9908 に更新されました。
vmsish はバージョン 1.03 から 1.04 に更新されました。
warnings はバージョン 1.18 から 1.23 に更新されました。
Win32 はバージョン 0.47 から 0.49 に更新されました。
XS::Typemap はバージョン 0.10 から 0.13 に更新されました。
XSLoader はバージョン 0.16 から 0.17 に更新されました。
この文書は Perl v5.14 で削除されました(実際には perlgit とリネームされて 大きくオーバーホールされました)が、Perl 文書 web サイトでは Perl v5.12 の 古い文書が最新版として表示されていました。 この文書は読者を現在の情報に導くようなスタブ形式で復旧されました。
新しいインデックス/値の配列 slice とキー/値のハッシュ slice の文法を 文書化するための新しい節が追加されました。
デバッガサブルーチン DB::goto
と DB::lsub
が文書化されました。 [perl #77680]
\cK
にマッチングする \s
は実験的としてマークされました。
ithreads は v5.8.0 に受け入れられました (しかし v5.20.0 から非推奨です)
long double は実験的とは考えられていません。
正規表現の中のコード、正規表現バックトラッキング動詞、左辺値サブルーチンは もはや実験的ではありません。 (これは perlre と perlsub にも影響します。)
chop
と chomp
はハッシュ反復子をリセットすることについて 指摘するようになりました。
exec
の引数の扱いについてより明確に文書化されました。
eval EXPR
は、ロケールによっては浮動小数点数が拡張されることについて 警告するようになりました。
goto EXPR
が文書化されました; これは goto &$coderef
であるかのように、 コードリファレンスに評価される式を扱います。 この振る舞いは少なくとも 10 年前からあります。
Perl v5.10 から、ファイルの先頭に追加する初期ソースコードを保持するスカラへの リファレンスを返すサブルーチンを @INC
に設定することが可能でした。 これが文書化されました。
ref
の文書は、bless されたオブジェクトのリファレンスを扱うときに blessed
, isa
, reftype
を使うことを進めるように更新されました。
このリリースでの perl の内部で行われた変更を反映するための多くの小さな変更が 行われました。
新しい節である Read-Only Values と Copy on Write が追加されました。
Super Quick Patch Guide 節が 更新されました。
gdb
の使用法に関するさらなる例を追加するために文書が更新されました。
perllexwarn 文書は warnings プラグマによって理解される警告カテゴリの 階層を記述していました。 この記述は warnings 文書自身に移され、perllexwarn はそこへのポインタを 示すスタブになりました。 この変更により、レキシカルな警告に関する全ての文書が一ヶ所に固まりました。
文書は fc() と \F
に触れるようになり、一般的に多くの明確化と修正が 行われました。
Perl の言語設計は、常に単一型演算子として呼び出されます。 これが明示的に言及されるようになりました。
open
チュートリアルは Tom Christiansen によって完全に書き直され、 開くことができる全てのものへの包括的なリファレンスを提供するのではなく、 基本だけに焦点を当てるようになりました。 この書き直しは、Alexander Hartmaier によって書かれた既存の perlopentut の 改良から始まった perl5-porters での活発な議論の結果です。 「open
についてあなたが知りたいと思う以上の」文書は将来のバージョンの perl に引き続くかもしれません。
正規表現エンジンは (?{}) と (??{}) 構文を任意の回数呼び出しても無効である (しかしこれは一般的にマッチングが成功したときに空気を読みます) という事実が 文書化されました。
(非破壊置換のための) /r
修飾子が文書化されました。 [perl #119151]
/x
と (?# comment)
に関する文書が拡張され明確化されました。
regcomp.c の最近の変更を反映するために更新されました。
再帰呼び出しに対してプロトタイプに効果を持たせるためには、プロトタイプ付きの 再帰関数を先行宣言する必要があることが文書化されました。 [perl #2726]
perl 実装で使われるサブルーチン名の一覧が追加されました。 [perl #77680]
JavaScript 節が追加されました。
Unicode 6.3 での Bidi_Class
の変更を反映するために更新されました。
$`, $&, $' の性能問題と Perl のバージョンによる違いを説明する新しい節が 追加されました。
長い間文書化されていましたが実際には存在していなかった、三つの English 変数名が文書から削除されました。 それは $OLD_PERL_VERSION
, $OFMT
, $ARRAY_BASE
です。
MY_CXT
の例のいくつかの問題が修正されました。
以下の追加や変更が、警告や致命的エラーメッセージ含む診断出力に行われました。 完全な診断メッセージの一覧については、perldiag を参照してください。
delete argument is index/value array slice, use array slice
(F) インデックス/値形式の配列スライス文法 (%array[...]
) を delete
への 引数として使いました。 おそらく @ シンボルを使って @array[...]
としたかったのでしょう。
delete argument is key/value hash slice, use hash slice
(F) キー/値形式のハッシュスライス文法 (%hash{...}
) を delete
への 引数として使いました。 おそらく @ シンボルを使って @hash{...}
としたかったのでしょう。
Magical list constants are not supported
(F) マジカルな配列からスタッシュ要素に代入した後、同じスロットから サブルーチンを使おうとしました。 Perl のバージョンによって詳細が変更されるような、Perl にできないことを させようとしました。
Setting $/ to a %s reference is forbidden が 追加されました。
%s on reference is experimental:
"auto-deref" 機能は実験的です。
v5.14.0 から、push, pop, keys およびその他の組み込み関数は、集合型だけでなく そのリファレンスも使うことができました。 この機能は元々意図していた仕様通りに配置されず、今では接尾辞デリファレンスと 重複になっているかもしれません。 これは常に実験的機能としてカテゴリ化され、v5.20.0 から警告が発生します。
コンパイル時にこれらの操作が検出されると警告が発生するようになりました。
no if $] >= 5.01908, warnings => "experimental::autoderef";
しかし、安定する前に振る舞いが再び変更されるかも知れないので、これらの機能の 使用を置き換えることを検討してください。
A sequence of multiple spaces in a charnames alias definition is deprecated
Trailing white-space in a charnames alias definition is deprecated
\N{...}
に関するこれら二つの廃止予定警告は実装が正しくありませんでした。 これらはデフォルトでは警告されず(今は警告されるようになりました)、 use warnings FATAL => 'deprecated'
で致命的エラーにすることが できませんでした(今はできるようになりました)。
Attribute prototype(%s) discards earlier prototype attribute in same sub
(W misc) 例えば、sub foo : prototype(A) : prototype(B) {}
のような形で サブルーチンが宣言されました。 それぞれのサブルーチンは一つだけのプロトタイプを持てるので、後者が 適用されたときに前者の宣言はは捨てられました。
Invalid \0 character in %s for %s: %s\0%s
(W syscalls) パス名やその他のシステムコール引数内の組み込みの \0 文字は 5.20 から警告を出力するようになりました。 以前は \0 より後ろの部分はシステムコールによって無視されていました。
Matched non-Unicode code point 0x%X against Unicode property; may not be portable.
これは "Code point 0x%X is not Unicode, all \p{} matches fail; all \P{} matches succeed" というメッセージを置き換えます。
Missing ']' in prototype for %s : %s
(W illegalproto) [
でグループ化が始まりましたが ]
で閉じられていません。
Possible precedence issue with control flow operator
(W syntax) フロー制御演算子 (例えば return
) と or
のような 低優先順位の演算子を混ぜたときに起こりうる問題です。 例えば:
sub { return $a or $b; }
これは以下のようにパースされ:
sub { (return $a) or $b; }
これは実際には単に以下のものです:
sub { return $a; }
かっこを使うか、高優先順位版の演算子を使ってください。
これは以下のような構文でも発生するかもしれないことに注意してください:
sub { 1 if die; }
Postfix dereference is experimental
(S experimental::postderef) この警告は、実験的な接尾辞デリファレンス文法を 使ったときに出力されます。 この機能を使いたいときは単に警告を抑制してください; しかしそうすることは 将来のバージョンの Perl で変更されたり削除されたりするかもしれない実験的な 機能を使うリスクを取るということです:
no warnings "experimental::postderef";
use feature "postderef", "postderef_qq";
$ref->$*;
$aref->@*;
$aref->@[@indices];
... etc ...
Prototype '%s' overridden by attribute 'prototype(%s)' in %s
(W prototype) サブルーチン名の後のかっことプロトタイプ属性の両方で プロトタイプが宣言されました。 属性からのプロトタイプで置き換えられるので、かっこによるプロトタイプは 無効です。
Scalar value @%s[%s] better written as $%s[%s]
(W syntax) スカラコンテキストで、配列の単一の要素を選択するために (% で示される) インデックス/値形式の配列スライスを使いました。 一般的に、($ で示される)スカラ値で問い合わせるべきです。 違いは以下の通りです; $foo[&bar]
は返り値の場合と引数を評価する場合で 常にスカラとして振る舞いますが、%foo[&bar]
は添え字に対して リストコンテキストを提供するので、一つの添え字を想定している場合は おかしなことが起こります。 リストコンテキストで呼び出されたときは、値に加えてインデックス (&bar
が 返すもの) も返ります。
Scalar value @%s{%s} better written as $%s{%s}
(W syntax) スカラコンテキストで、ハッシュの単一の要素を選択するために (% で示される) インデックス/値形式の配列スライスを使いました。 一般的に、($ で示される)スカラ値で問い合わせるべきです。 違いは以下の通りです; $foo{&bar}
は返り値の場合と引数を評価する場合で 常にスカラとして振る舞いますが、@foo{&bar}
は添え字に対して リストコンテキストを提供するので、一つの添え字を想定している場合は おかしなことが起こります。 リストコンテキストで呼び出されたときは、値に加えてキーも返ります。
Setting $/ to a reference to %s as a form of slurp is deprecated, treating as undef
(S) PL_exit_flags
に PERL_EXIT_WARN
が設定されているときに、exit() が 呼び出されたかスクリプトが普通に終了しました。
(S) PL_exit_flags
に PERL_EXIT_WARN
が設定されているときに、 捕捉されていない die() が呼び出されました。
Use of literal control characters in variable names is deprecated
(D deprecated) $^X と ${^GLOBAL_PHASE} のように、^FOO 変数を参照する元として リテラルな制御文字を使うのは廃止予定になりました。 これは $\cT で、\cT がソースコード中の (SOH
のような) 制御文字の場合にのみ 影響します: ${"\cT"} と $^T は有効のままです。
Useless use of greediness modifier
これは [Perl #42957] を修正します。
正規表現エンジンからの警告とエラーは UTF-8 クリーンになりました。
"Unknown switch condition" エラーメッセージは少し変更されました。 このエラーは、(?(foo))
条件文で不明な条件のときに起こります。 エラーメッセージは以下のような形でした:
Unknown switch condition (?(%s in regex;
しかし %s が何になるかはほとんど運でした。 (?(foobar))
の場合は、"fo" または "f" になるかもしれません。 Unicode 文字の場合は、一般的には壊れた文字列になります。 メッセージは以下のように変更されました:
Unknown switch condition (?(...)) in regex;
さらに、エラー中の '<-- HERE'
マーカーが正規表現中の正しい位置を 指し示すようになりました。
"%s "\x%X" does not map to Unicode" 警告は、致命的エラーではなく、重大な警告に 正しく分類されるようになりました。
稀な状況では、いつもの "Modification of a read-only value" ではなく "Can't coerce readonly REF to string" が出る場合がありました。 この代替エラーメッセージは削除されました。
"Ambiguous use of * resolved as operator *": これおよび、"%" と "&" に関する 同様の警告は、一部の状況ではこの種類の演算子が使われていないときにも 起こることがありました; この警告は完全に間違っています。 これは修正されました [perl #117535, #76910]。
不正なサブルーチンに関する警告は、どのようにプロトタイプが 表現されるかによってより一貫するようになりました。 これらの警告の一部はヌルを含むプロトタイプを切り詰めます。 その他の場合ではある警告は他のものを抑制します。 プロトタイプ中の不正な文字に関する警告は、間違った文字が下線の前にあるときに "after '_'" と言わなくなりました。
この警告は regexp カテゴリのみで、deprecated カテゴリではなくなりました。 これはデフォルトの(つまり重大な)警告のままです [perl #89648]。
%%s[%s] in scalar context better written as $%s[%s]
この警告は、コンパイル時にスカラコンテキストであると分かっている %array[$index]
や %hash{key}
で起きるようになりました。 以前は "Scalar value %%s[%s] better written as $%s[%s]" という文言でした。
Switch condition not recognized in regex; marked by <-- HERE in m/%s/:
この診断メッセージの説明は、この警告が起こる全ての場合に対応するように 拡張されました。 矢印指示子の位置の問題も解決しました。
my($a?$b$c)
と my(do{})
のためのエラーメッセージは、 'Can't declare null operation in "my"' ではなく、それぞれ "conditional expression" と "do block" に言及するようになりました。
use re "debug"
が後方参照を含む正規表現を実行したとき、デバッグ出力は どの文字列がマッチングされたかを表示するようになりました。
致命的エラーメッセージ Character following "\c" must be ASCII
は、 \cX
で X が 表示(非制御) ASCII 文字でなければならないことを 強調するために、Character following "\c" must be printable ASCII
に 変更されました。
バッファの先頭より前にアクセスしようとしたときの off-by-one エラーによる クラッシュが修正されました。 [perl #120244]
git bisect ツール Porting/bisect.pl は多くの拡張が行われました。
これはソース配布の一部として提供されていますが、インストールはされません; git checkout の中で実行されていることに依存しているので 自己完結していないからです。 また、テストを修正したり実行時のバグを修正したりインストール時に何か 有用なことを行うものではないことにも注意してください - この目的は できるだけ「そのまま」ビルドと実行するための関心のある歴史的なリビジョンを 得るための最小限の変更点を作り、それによって git bisect
を簡単に 使えるようにするためのものです。
オプションでタイムアウト付きのテストを実行できるようになりました。
クリーンな clean git checkout を行ったその場で実行できるようになりました。
valgrind
以下のテストケースを実行できるようになりました。
ビルドする前にユーザーが提供したパッチを適用してソースを 修正できるようになりました。
いくつかのさらに歴史的な範囲の bleadperl をビルドできるように修正されました; これはバグや振る舞いの変更の起点を特定するのに有用です。
find2perl は ?
ワイルドカードを正しく扱えるようになりました。 [perl #113054]
perlbug に、バグ報告にパッチを添付するための -p
オプションが 追加されました。
perlbug は、Windows では行末が CRLF の報告テンプレートを供給するように 修正されました。 [perl #121277]
perlbug は、報告のエンコーディングについてできるだけ仮定を置かないように なりました。 これは将来にはおそらく、デフォルトでは UTF-8 を仮定するけれどもユーザーが 上書きできるように変更されます。
SDBM_File のための Makefile.PL はよりよい Makefile を 生成するようになりました; これは、ビルド失敗を引き起こす、並列 make 中の 競合条件を回避します。 これは (*nix プラットフォームでの) 知られている最後の並列 make での 問題だったので、これで並列 make は常にエラーなしになったと信じています。
installperl と installman のオプションの扱いは、Getopt::Long を 使うようにリファクタリングされました。 双方は Makefile install
ターゲットで使われていて、かつこれらは インストールされないので、これらの変更はおそらくカスタムインストール スクリプトにのみ影響を与えます。
一文字オプションは長い名前も持つようになりました。
不正なオプションは拒否されるようになりました。
オプションでないコマンドライン引数は拒否されるようになりました。
それぞれは、使用法メッセージを表示する --help
オプションを 持つようになりました。
文書化された正当な起動方法での振る舞いは変わっていません。
可能なら、ピュア Perl エクステンションをビルドするときに、ビルドの並列性を 損なうことなく make の再帰的な起動を回避するようになりました。 現在のところおよそ 80 のエクステンションが直接 make_ext.pl ツールによって 処理されるので、make を 80 回起動して、miniperl を 160 回 起動するということはもはや起こりません。
GCC または Clang でリンク時最適化が有効 (-flto
オプション) のときに、 ビルドシステムは正しく動作するようになりました。 [perl #113022]
d_libname_unique
による明確なライブラリ基本名。
このオプション付きで perl をコンパイルするとき、XS モジュールのための ライブラリファイルの名前はある意味「ユニーク」です -- 例えば、 Hash/Util/Util.so は Hash/Util/PL_Hash__Util.so になります。 この振る舞いは現在 VMS に起きているものと似ていて、Android 版の基礎を 提供します。
gcc と clang での論理ルートディレクトリを示す sysroot
オプション。
このオプションを設定してビルドしたとき、Configure とコンパイラは、/ ではなく、 この新しい sysroot から全てのヘッダとライブラリを検索します。
これはクロスコンパイル時に非常に時間を節約しますが、ツールチェインの ファイルが非標準の位置にある場合はネイティブなビルドでも助けになります。
クロスコンパイルモデルが刷新されました。 いくつかの新しいオプションと、いくつかの後方互換性のない変更があります:
全ての miniperl 呼び出しをターゲットで実行するのではなく、ホストで使うための miniperl と generate_uudmap をビルドするようになりました; これは、 'make test' の手前で、一旦 Configure が終了すればもはやターゲットシステムに アクセスする必要がないということです。 Configure の hostperl
と hostgenerate
オプションを通して、既に ビルドされたバイナリを提供できます。
さらに、ASCII ホストから EBCDIC プラットフォームをターゲットにする場合、 またはその逆の場合、generate_uudmap をターゲットで実行する必要があることを 示すために -Uhostgenerate
付きで Configure を実行する必要があります。
最後に、targethost
を指定せずにクロスコンパイルすることで、ホストバイナリを ビルドした直後に Configure を終了させる方法もあります。
互換性のない変更には、もはや xconfig.h, xlib, Cross.pm を使わないということが 含まれているので、既存の設定ファイルと Makefile は更新する必要があります。
前記に関連して、ターゲットシステムの sh (または等価物) の位置を指定する 方法ができました: targetsh
。
例えば、Android では sh は /system/bin/sh にあるので、sh が /bin/sh である、 より普通の Unix 風システムからクロスコンパイルする場合、 "targetsh" は /system/bin/sh になり、"sh" は /bin/sh になります。
デフォルトでは、gcc 4.9 は perl を壊すような最適化を行っていました。 -fwrapv オプションはこれら(およびおそらくその他)の最適化を無効にするので、 gcc 4.3 以降 (同様の問題はより古いバージョンにもあったかもしれませんが、 -fwrapv は 4.3 までは壊れていて、おそらく最適化がなくなることは ないので) では、ユーザーが -fwrapv を無効にする -fno-wrapv、または -fwrapv のオーバーフローを実行時エラーにするのを無視する -fsanitize=undefined を指定しない限り、Configure は -fwrapv を 追加します。 [perl #121505]
test.valgrind
make ターゲットは、テストを並列に実行できるようになりました。 このターゲットは Perl のテストスイートを Valgrind の元で実行できるようにし、 ある種の C プログラミングエラーを検出しますが、かなり時間がかかります。 適切なハードウェアがあれば、並列実行によって追加のコストをかなり取り戻せます。 [perl #121431]
t/porting/ 以下の様々なテストは、perl の .git ディレクトリが perl ツリーの外側で $GIT_DIR
で示されている場合でも、飛ばされなくなりました。 [perl #120505]
テストスイートは、ユーザーの対話的シェルが$PWD
環境変数を 保守しているけれども、テスト実行のために使われる /bin/sh が 保守していない時にも失敗しなくなりました。
ネイティブとクロスコンパイルの両方、現在利用可能な三つのアーキテクチャ (ARM, MIPS, x86) 全て、および幅広いバージョンの Android で ビルドできるようになりました。
OpenBSD のフォークである Bitrig のためのコンパイル対応が追加されました。
FreeMiNT のための対応が追加されました; これは Atari ST システムとその子孫の ためのフリーなオープンソース OS で、元の MiNT は Atari によって公式に 譲渡されました。
Synology は、(Marvell Kirkwood mv6282 - ARMv5tel や Freescale QorIQ P1022 ppc - e500v2 のような) ワークステーションや開発用ではない比較的安価な CPU と 軽量 Linux ディストリビューション (DSM) の NAS ボックスを出荷しました。 これらのマシンでビルドできるようになったはずです。 基本的な問題は、ツールのための非標準の位置です。
sfio
sfio
I/O システム対応に関係するコードは削除されました。
Perl 5.004 で、sfio
(AT&T の Safe/Fast I/O ライブラリ) の ネイティブ API 使用の対応が追加されました。 このコードは多くの退行テストが失敗していたにも関わらず v5.8.0 でも ビルドされていましたが、不注意で v5.8.1 リリースの前に壊れました; つまり、 それ以降にリリースされたどのバージョンの Perl でも動作しません。 10 年以上これに関するバグ報告を受け取っていないので、この機能をまだ 対応していたバージョンの Perl でも誰も使っていなかったのは明らかです。
3b1、またの名を AT&T Unix PC (および同様の AT&T 7300) の Configure 対応は 削除されました。
DG/UX は Data General によって販売されていた Unix です。 最後のリリースは 2001 年 4 月です。 これは Data General 独自のハードウェアでのみ実行されます。
定期的な smoke の報告源がないので、ネイティブな EBCDIC プラットフォームに 対応することを意図したコードは 5.22.0 の前に perl から取り除かれる予定です。
接続されたハンドルへの recv() は、返された送り先アドレスがたまたまワーク バッファにになったもので埋められていました。 recv() は Win32 recv() ラッパーと同様の回避策を使うようになり、 recvfrom(2) が与えられたアドレスの長さを修正しない場合は空文字列を 返すようになりました。 [perl #118843]
Cygwin 1.7.28 での cygwin.c のビルドエラーが修正されました。
テストは cygserver
が実行されなかった時に起きるエラーを 扱うようになりました。
BSD 互換ライブラリ libbsd
はもはやビルドに必要なくなりました。
ヒントファイルが libgdbm_compat
を探すのは libgdbm
自身が必要な 場合にのみになりました。 前者は後者なしではまったく有用ではなく、一部の状況では、これを含めると 実際にはビルドを妨げることがあります。
ビルドシステムは、ユーザーが実行した Configure から提供された ld
設定に 従うようになりました。
objformat
は MidnightBSD のバージョン 0.4-RELEASE で削除され、それ以前の バージョンでは廃止予定でした。 これにより、ビルド環境が誤って elf
ではなく a.out
として 設定されていました。 これは修正されました。
混合エンディアンプラットフォームでの pack
と unpack
操作に対応する コードが削除されました。 Perl は長い間 (PDP-11 のような) 混合エンディアンプラットフォームでは ビルドできなくなっていたはずなので、この変更により、v5.18.0 がビルドできる プラットフォームに影響することはないと考えています。
Win32 での rename
と link
は、適切な場合に $! に ENOSPC と EDQUOT を 設定するようになりました。 [perl #119857]
一部または (ほとんど) 全てのエクステンションを静的に (perl520.dll および 独立した perl-static.exe にも)リンクするための BUILD_STATIC と ALL_STATIC の makefile オプションは MinGW ビルドでは壊れていました。 これは修正されました。
ALL_STATIC オプションは、(VC++ と MinGW の両方のビルドで) Encode と Win32 の エクステンションをリンクするように改良されました。
Visual C++ 2013 でのビルド対応が追加されました。 現在のところ二つのテストに失敗することがあります ("Testing Perl on Windows" in perlwin32 を参照してください) が、うまくいけば まもなく解決されます。
Intel C++ Compiler でビルドするための実験的な対応が追加されました。 nmake makefile (win32/Makefile) と dmake makefile (win32/makefile.mk) が 使えます。 "nmake test" は今のところ cpan/CGI/t/url.t によって失敗します。
"kill" in perlfunc と負数のシグナルを使ってプロセスツリーを kill するのは 5.18.0 から壊れていました。 このバグで、kill
は有効な PID でも負数のシグナルに対して 0 を返し、 プロセスを終了させていませんでした。 これは修正されました [perl #121230]。
(miniperl.exe のみで) require()
での、普通は 失敗する、多くの I/O 呼び出しを削減することで、Windows で perl を ビルドするのにかかる時間はかなり大幅に削減されました (典型的にはこの領域で 30-40% 短くなっています)。 [perl #121119]
テストのために使っているタイムアウトモニタをテスト終了時に キャンセルすることができないために、次のテストファイルの前にタイムアウト 時間全てが経過するというバグのために、make test
の実行時に 15 分ほど スリープする問題は修正されました。 [perl #121395]
疑似フォークなしでビルドされた perl において (疑似フォークビルドはこのバグに 影響されません)、kill()
によるプロセスツリーの kill と 負のシグナルは、kill()
が返り値を反転させます。 例えば、kill()
が 1 プロセスツリー PID を kill すると、1 ではなく 0 を返し、kill()
に不正な 2 PID が渡されると 0 ではなく 2 を返します。 これはおそらくプロセスツリー kill 機能が Win32 で実装されたときからあります。 これは修正されて、文書化されている通りの振る舞いになりました。 [perl #121230]
64 ビット perl をビルドするとき、ビルド処理の間に miniperl.exe が 未初期化メモリを読み、結果として 4GB wperl.exe が 作成されることがあります。 これは修正されました。 (perl.exe 自身には影響しませんが、明らかに wperl.exe は完全に 壊れていることに注意してください。) [perl #121471]
http://www.mingw.org の gcc バージョン 4.8.1 で Perl を ビルドできるようになりました。 これは以前は perl のソースファイルの一つでの DllMain() の定義が 間違っていたために壊れていました。 w32api パッケージのバージョン 4 を使っている場合は、より古い gcc バージョンも影響を受けます。 http://mingw-w64.sourceforge.net/ から利用可能なバージョンの gcc は 影響を受けません。 [perl #121643]
NTFS ドライブのある Windows OS 上で FAT ドライブでビルドしても、 テストハーネスは失敗しなくなりました。 [perl #21442]
fork() エミュレーションのコンテキストスタックをクローン化するときに、 Perl_cx_dup() は、&foo;
のように引数を含んでいないコンテキストスタック エントリの引数情報にアクセスするとクラッシュしていました。 [perl #121721]
perl #113536 によって 導入されていた、5.18.0 からほとんどの Win32 Perl で system
および逆クォート ( ``
) を呼び出す毎に起きていたメモリリークは修正されました。 このメモリリークは、Win32 Perl のビルド時に疑似フォークを有効にしていて、 Server 2003 R2 以降の OS 実行したときにのみ発生していました。 このリークは WinXP SP3 では起こりません。 [perl #121676]
XS モジュールのビルドが大幅に復旧されました。 いくつかは(まだ)できませんが、(Socket と ExtUtils::MakeMaker に対する) うまくいけばまもなく統合されるさらなるいくつかのパッチだけで WinCE で Perl をビルド出来るようになりました。
nmake -f Makefile.ce all
とすることで、ユーザーの介入なしで WinCE で Perl を ビルド出来るようになりました。
EVC (Embedded Visual C++) 4 でのビルド対応が復旧されました。 Perl はまた Smart Devices for Visual C++ 2005 または 2008 を使って ビルドすることもできます。
$1, $2 など、$`, $&, $', ${^PREMATCH}, ${^MATCH}, ${^POSTMATCH} の マッチング変数の内部表現が変わりました。 これでメモリ消費が少し少なくなり、検索時の文字列比較と数値変換がなくなり、 C で 23 行短くなりました。 この変更は外部のコードには影響しないはずです。
配列に関して内部で使っていないスロットを表現するために &PL_sv_undef の代わりに NULL を使うようになりました。 &PL_sv_undef はもはや特殊な値として扱われなくなったので、 av_store(av, 0, &PL_sv_undef) は読み込み専用未定義スカラを保持する配列の 要素 0 になります。 $array[0] = anything
は croak になり、\$array[0]
は \undef
との 等価性を比較します。
HeSVKEY_force() から返された SV は、キーが SV として保管されていないときに 基となるハッシュキーの UTF8 性を正しく反映するようになりました。 [perl #79074]
XS コードで利用可能な一部のめったに使われない関数とマクロが 廃止予定になりました。 その一覧は: utf8_to_uvuni_buf
(代わりに utf8_to_uvchr_buf
を使ってください)、 valid_utf8_to_uvuni
(代わりに utf8_to_uvchr_buf
を使ってください)、 NATIVE_TO_NEED
(どちらにしろ適切に動作していませんでした)、 and ASCII_TO_NEED
(どちらにしろ適切に動作していませんでした) です。
このリリースから、アプリケーションでプラットフォームの文字集合と Unicode の 最下位の 256 文字を基にした Latin1 を区別する必要はまずなくなりました。 新しいコードは utf8n_to_uvuni
(代わりに utf8_to_uvchr_buf
を 使ってください) や uvuni_to_utf8
(代わりに uvchr_to_utf8
を 使ってください) を使うべきではありません。
多くのめったに(あるいは全く)使われないテストとプロファイリングのための Makefile のショートカットターゲットは削除されるか、それを使っている その他の Makefile ターゲットのみにまとめられました。 特に、以下のターゲットは、それを参照していたり使い方を説明したりしている 文書と共に削除されました:
check.third check.utf16 check.utf8 coretest minitest.prep
minitest.utf16 perl.config.dashg perl.config.dashpg
perl.config.gcov perl.gcov perl.gprof perl.gprof.config
perl.pixie perl.pixie.atom perl.pixie.config perl.pixie.irix
perl.third perl.third.config perl.valgrind.config purecovperl
pureperl quantperl test.deparse test.taintwarn test.third
test.torture test.utf16 test.utf8 test_notty.deparse
test_notty.third test_notty.valgrind test_prep.third
test_prep.valgrind torturetest ucheck ucheck.third ucheck.utf16
ucheck.valgrind utest utest.third utest.utf16 utest.valgrind
「手動で」関連するコマンドを実行することはまだ可能です - 基となる機能は 削除されていません。
Perl がロケールの扱いを初期化しないようにすることができるようになりました。 ほとんどの部分で、Perl はロケールに関心を払いません。 (perllocale を参照してください。) にも関わらず、今まで、プログラムが結局ロケールを使う場合に備えて、 起動時にロケールの扱いをシステムデフォルトに初期化していました。 (これはロケールを認識するプログラムが最初に、実際に必要かどうかを Perl が 知るずっと前にするべきことの一つです。) これは、Perl がシステムデフォルト以外のロケールを使いたい他の アプリケーションに組み込まれている場合以外はうまく動作します。 Perl の起動時に環境変数 PERL_SKIP_LOCALE_INIT
が設定されていると、この 初期化ステップが飛ばされるようになりました。 これ以前では、Windows プラットフォームでのこの欠陥の回避策は、内部の Perl コードを修正したものを使うことだけでした。 古い Perl を使う必要のあるアプリケーションは、C プリプロセッサシンボル HAS_SKIP_LOCALE_INIT
が定義されていないことをテストすることで、組み込み Perl が回避策を使う必要があるかを発見できます。 (RT #38193)
BmRARE
と BmPREVIOUS
は削除されました。 これらはどこでも使われておらず、API の一部ではありませんでした。 XS モジュールに対しては、これらは 0 に #define されるようになりました。
通常は読み込み専用値を croak する sv_force_normal
は、コンパイル時に 読み込み専用値を変更することが可能でした。 これはとにかく読み込み専用値を croak するように変更されました。 この変更によりいくつかのコアのバグが明らかになりました。
Perl の新しいコピーオンライト機構 (デフォルトで有効になりました) は、 任意の SvPOK
スカラを、コピーされたときに自動的にコピーオンライトスカラに 昇格できるようになりました。 文字列バッファの参照カウントは文字列バッファ自身に保管されるようになりました。
例えば:
$ perl -MDevel::Peek -e'$a="abc"; $b = $a; Dump $a; Dump $b'
SV = PV(0x260cd80) at 0x2620ad8
REFCNT = 1
FLAGS = (POK,IsCOW,pPOK)
PV = 0x2619bc0 "abc"\0
CUR = 3
LEN = 16
COW_REFCNT = 1
SV = PV(0x260ce30) at 0x2620b20
REFCNT = 1
FLAGS = (POK,IsCOW,pPOK)
PV = 0x2619bc0 "abc"\0
CUR = 3
LEN = 16
COW_REFCNT = 1
両方のスカラは同じ PV バッファを共有し、COW_REFCNT が 0 より大きいことに 注意してください。
つまり、SV の SvPVX()
バッファを修正したい XS コードは、バッファを有効な (かつ共有されてない)ものにするために SvPV_force()
または同様のものをまず 呼び出し、その後で SvSETMAGIC()
を呼び出すべきということです。 これは実際にはいつも当てはまります (例えばハッシュキーは常に コピーオンライトです); この変更は単に COW の振る舞いを SV のより広い亜種に 広げます。
5.18.0 以前との大きな違いの一つは、共有ハッシュキースカラは SvREADONLY
フラグが設定されていたことです; 今ではこれは当てはまりません。
この新しい振る舞いは -Accflags=-DPERL_NO_COW 付きで Configure を 実行することでまだ無効にできます。 このオプションはおそらく Perl 5.22 で削除されます。
PL_sawampersand
は定数になりました。 この変数が提供していた ($&
が見えるかどうかに依存したマッチング前のコピーを 有効/無効にする) スイッチは削除されてコピーオンライトで置き換えられ、 いくつかのバグが修正されました。
以前の振る舞いは -Accflags=-DPERL_SAWAMPERSAND 付きで Configure を 実行することでまだ有効にできます。
関数 my_swap
, my_htonl
, my_ntohl
は削除されました。 なぜこれらの関数が API の一部として A とマークされたかははっきりしません。 XS コードは直接これらを呼び出せません; これらがコンパイルされているかどうかに 依存できないからです。 驚くには値しませんが、CPAN でこれらを参照しているコードはありません。
Perl_re_intuit_start()
正規表現関数のシグネチャが変更されました; 正規表現プラグイン構造体の intuit
関数ポインタも同様に変更されました。 新しい引数 strbeg
が追加されました; これは Perl_regexec_flags
の 同じ名前の引数と同じ意味を持ちます。 以前は intuit は (もしあれば) 渡された SV から文字列の先頭を推測していて、 (例えばオーバーロードされた SV のときに) 時々間違っていました。
Perl_regexec_flags()
正規表現関数のシグネチャが変更されました; 正規表現エンジンプラグイン構造体の関数ポインタ exec
も、一致するように 変更されました。 minend
引数は、64 ビットシステムへのよりよい対応のために SSize_t
型に なりました。
XS コードは、(例えば toLOWER_utf8()
のように)文字や符号位置の 大文字小文字を変えるために様々なマクロが使えます。 これらのうち二つのみがこれまで文書化されていました; そしてこれらは基となる 関数を呼び出すよりも優先して使うべきです。 "Character case changing" in perlapi を参照してください。
コードは uid と gid に関してかなり一貫性なく扱っていました。 ある場所では安全に UV に保管できると仮定し、ある場所では IV に、ある場所では int でした。 四つの新しいマクロが導入されました: SvUID(), sv_setuid(), SvGID(), sv_setgid()
sv_pos_b2u_flags
が API に追加されました。 これは sv_pos_b2u
と似ていますが、64 ビットプラットフォームでの長い文字列に 対応しています。
PL_exit_flags
は、perl が終了しようとしたときに warn
または abort
を 行うために perl 組み込み者やその他の XS コードによって 使われるようになりました。 [perl #52000]
perl が C89 コンパイラに対して bool
から char
への別名を エミュレートするための -Accflags=-PERL_BOOL_AS_CHAR
付きのコンパイルは、 C99 と C++ コンパイラで動作するようになりました。 [perl #120314]
"sv_2pv_flags" in perlapi, "sv_2iv_flags" in perlapi, "sv_2uv_flags" in perlapi, "sv_2nv_flags" in perlapi およびこれらの古いラッパーである sv_2pv, sv_2iv, sv_2uv, sv_2nv の sv
引数は非 NULL になりました。 NULL を渡すとクラッシュするようになりました。 非 NULL マーカーが 5.9.3 に一斉に導入されたとき、これらの関数は非 NULL と マークされましたが、5.0 alpha 2 で SV API が作成されたときから、NULL が 渡されると、これらの関数は 0 または偽の型の値を返していました。 非 NULL の sv
引数に対応するコードは直接的には 5.0 alpha 2 から、 間接的には Perl 1.0 (5.0 以前の API) から始まります。 この関数が NULL sv
を受け付けるという文書の欠如は 5.11.0 で修正され、 5.11.0 から 5.19.5 では関数は NULLOK とマークされました。 NULLOK コードの最適化は削除され、この関数は再び非 NULL として マークされました; コアの getter 型のマクロは決してこれらの関数に NULL を 渡すことはなく、以前は NULL を渡すとクラッシュしていたからです。
sv_2*v* 関数に NULL sv
を渡す唯一の方法は、XS コードが直接 sv_2*v* を 呼び出すことです。 SV から基となる値を取得するために XS コードが Sv*V* マクロを使うことは ありそうもありません。 NULL sv
が sv_2*v* 関数に渡されることになる一つの可能性は、 XS コードが、デリファレンスする 前に NULL チェックをする 独自のゲッター型 Sv*V* マクロを定義しているということです; 公式 API の Sv*OK* マクロかプライベート API である SvFLAGS
を直接使って SV のフラグをチェックし、sv
が NULL の場合、NULL リテラルまたは NULL 値を 含む sv
で sv_2*v 関数を呼び出すことです。
newATTRSUB はマクロになりました
公式 API である newATTRSUB は以前はプライベート関数 Perl_newATTRSUB への マクロでした。 関数 Perl_newATTRSUB は削除されました。 newATTRSUB は異なる内部関数へのマクロになりました。
utf8n_to_uvchr()
で発生する警告の変更
この最下位層の関数は UTF-8 文字列の最初の文字を符号位置にデコードします。 これは XS
レベルのコードからアクセス可能ですが、これを直接使うのは 非推奨です。 "utf8_to_uvchr_buf" in perlapi のように、代わりに使うべき、これを呼び出す 高レベル関数があります。 完全性のために、これは少し変更されて文書化されました。 不正データのためのテストはその他の潜在的な問題のためのテストの前に 行われるようになりました。 これらの問題の一つは、どの公式標準にも現れないほど大きい符号位置に 関するものです (現在の標準は以前のバージョンでの最大の受け入れられる符号位置に 規模を縮小しています)。 これらの符号位置は警告または禁止しますが、より小さい符号位置だけれどもまだ 正当な Unicode の条件よりは上のものは受け入れる可能性はあります (しかし CPAN にはありません)。 このための警告メッセージは、このマシンが表現できるなら符号位置を 含むようになりました。 以前は常に生のバイト列を表示しています; 表現できない符号位置に関しては 今でも行っていることです。
プラグ可能正規表現インターフェ−スに影響する正規表現エンジンの変更
regexp.h 経由で露出していて、struct regexp の extflags メンバを埋めるために 使われていた多くのフラグが削除されました。 これらのフィールドは技術的には Perl 自身の正規表現のためのプライベートな もので、第一にここで露出するべきものではありません。
影響を受けるフラグは:
RXf_NOSCAN
RXf_CANY_SEEN
RXf_GPOS_SEEN
RXf_GPOS_FLOAT
RXf_ANCH_BOL
RXf_ANCH_MBOL
RXf_ANCH_SBOL
RXf_ANCH_GPOS
以下のフラグマスクも影響します:
RXf_ANCH_SINGLE
RXf_ANCH
これら全ては PREGf_ 等価物にリネームされて regcomp.h に移動しました。
以前 (RXf_ANCH マスク経由で) RXf_ANCH_ フラグを設定することによって 達成されていた振る舞いは、extflags の「単一の」フラグビットで 置き換えられました:
RXf_IS_ANCHORED
プラグ可能な正規表現エンジンは、以前はこれらのフラグを設定することで 使っていましたが、このフラグを「単一で」使うようになりました。
Perl コアは、av_len()
に対してより明確に命名された同義語である av_tindex()
(「配列の先頭のインデックス」) を一貫して使うようになりました。
不明瞭なインタプリタ変数 PL_timesbuf
は 5.21.x 開発リリースの初期に 削除される予定なので、Perl 5.22.0 ではこれは XS 作者に提供されません。 この変数は 5.20.0 でもまだ存在しますが、事前の廃止予定警告がこの変数を 使っている人の助けになることを期待しています。
マッチングされる文字列が 32 ビットシステムで 2GB の線よりも上位に 割り当てられていたときにマッチングに失敗したり perl がクラッシュしたりしていた 少数の正規表現構文が修正されました。 [RT #118175]
(?[...])
正規表現構文のパースに関する様々なメモリリークが修正されました。
(?[...])
は、内側に大かっこ文字クラスを含む、(?[...])
形式の事前 コンパイル済みパターンでの変数展開が可能になりました ($pat = qr/(?[ [a] ])/; /(?[ $pat ])/
)。 以前は、大かっこは正規表現パーサを混乱させていました。
Perl v5.10 から、trie 最適化を引き起こす代替 (例えば "a|b") を含む正規表現に 対して "Quantifier unexpected on zero-length expression" 警告メッセージが 2 回出力されることがありました。
Perl v5.18 は不注意で、昇格された UTF-8 文字列と降格された UTF-8 文字列を 正規表現で混ぜると、パターン中に不正な UTF-8 が生成されるというバグが 導入されていました: 特に \x80..\xff
の範囲の降格された文字が UTF-8 文字列に 引き続く場合です; 例えば
utf8::upgrade( my $u = "\x{e5}");
utf8::downgrade(my $d = "\x{e5}");
/$u$d/
[RT #118297]
複数のコードブロックを含む正規表現で、ネストした正規表現によって設定される $1
, $2
などの値はあるブロックから次のブロックにリークしていました。 これらの変数は、組み込みブロックの開始時の外側の正規表現を 参照するようになりました [perl #117917]。
/$qr/p
は Perl 5.18.0 で壊れていました; /p
フラグは無視されていました。 これは修正されました。 [perl #118213]
Perl 5.18.0 から、/[#](?{})/x
のような構文は #
を誤ってコメントとして 解釈していました。 コードブロックは読み飛ばされ、パースされていませんでした。 これは修正されました。
Perl 5.001 から、/[#$a]/x
または /[#]$a/x
のような正規表現は #
を 誤ってコメントとして解釈していて、変数が展開されていませんでした。 これは修正されました。 [perl #45667]
Perl 5.18.0 では不注意で、デリファレンスされた正規表現 (${ qr// }
) が 真偽値で偽になっていました。 これは修正されました。
正規表現でのパターンの先頭でない位置での \G
の使用は、少しバグが減りました (しかしまだ問題があります)。
コードブロックを含む正規表現 (/(?{...})/
) で、定数のオーバーロードが コードブロックの再コンパイルを引き起こすとき、2 回目のコンパイルがその 外側のレキシカルスコープから見えていませんでした。 これは Perl 5.18.0 の退行です。
文字列の内部表現が utf8 との間で変更された場合、pos
で設定される 文字列位置がずれることがありました。 これは例えば、文字列でオーバーロードしたオブジェクトへのリファレンスで 起こります。
同じ引数で呼び出した 2 回の pos
呼び出しの返り値のリファレンスを取り、 それから片方にリファレンスを代入してもう片方に undef
を代入すると、 アサート失敗やメモリリークを引き起こすことがありました。
存在しない捕捉を参照している @- と @+ の要素は正しく 更新されるようになりました。 以前は、引き続くマッチングの後、参照された要素 ($ref = \$-[1]
) は間違った マッチングを参照することがありました。
\123 のような、正規表現後方参照 (またはあいまいな後方参照/ 8 進数) を パースするコードは、長い 10 進文字列の負数が回り込むかもしれない、単なる atoi() を行っていて、セグメンテーションフォルトを引き起こしていました。 これは修正されました。 [perl #119505]
他の型グロブを *^R
に代入しても正規表現エンジンは クラッシュしなくなりました。
([^\n]
を意味する) 中かっこなしで使われた \N
正規表現エスケープは、 /x の元で空白が引き続くと、引き続く *
を無視していました。 5.12.0 で \N
が [^\n]
を意味するようになってからこのように なっていました。
s///
, tr///
, y///
は、デリミタとしてワイド文字を使っても 動作するようになりました。 [perl #120463]
(/(?</
のような) 正規表現内の終端されていない (?...) 並びの一部の場合は、 "panic: memory wrap" ではなく、適切なエラーメッセージを出力するように 修正されました。 (/(?(/
のような) その他の場合はまだ修正されていません。
オーバーロードされたオブジェクトへのリファレンスへのリファレンスが 正規表現 (??{...})
コードブロックから返されたとき、内側のリファレンスが 以前コードブロックで返されたものである場合に誤った暗黙のデリファレンスが 行われていました。
(??{...})
から返された tie された変数は、その FETCH メソッド内で 内側のマッチング変数 (つまり、ブロックの内側でマッチングしたものの $1 など) を 見ています。 これは、オーバーロードされたオブジェクトへのリファレンスが tie された変数へ 代入された最後のものである場合には当てはまっていませんでした。 代わりに、マッチング変数は FETCH 呼び出しの間外側のパターンを 参照していました。
ロケールを使った正規表現による想定しない汚染が修正されました。 以前は、ある種の状況では、文字クラスを使うと汚染されるべきではないときに 汚染を引き起こしていました。 一部の文字クラスはロケールに依存していますが、この修正の前では、ロケールに 依存していない文字クラスでも時々汚染が起きていました。 [perl #120675]
ある種の条件で、正規表現中の後方参照のアサートで、アサートが名前付き 部分パターンを参照し、後方参照の変数がないというエラーを出力していました。 これは修正されました。 [perl #120600], [perl #120618]。 現在の修正は将来改良される予定です。
$^R
は、これを初期化した正規表現の外側で利用可能ではありませんでした。 [perl #121070]
re_intuit_start() に対する多くの修正とリファクタリングがマージされました; 注目点は:
/\x{100}[xy]\x{100}{2}/
をコンパイルしたときの panic が修正されました。
UTF-8 文字列に対するグローバルなパターンマッチングを実行するときの性能上の 退行が修正されました。 [perl #120692]
/ab.{1,2}x/
のような正規表現で長い UTF-8 文字列をマッチングすると文字列の 大部分に対して不必要にバイトオフセットを計算するというもう一つの性能問題が 修正されました。 [perl #120692]
HP-UX 64 ビットの GCC でビルドされたときに正規表現をコンパイルしたときの アライメントエラーが修正されました。
64 ビットプラットフォームでは、pos
に 2**31-1 より大きい値を 設定できるようになりました。 [perl #72766]
デバッガの man
コマンドは修正されました。 これは v5.18.0 リリースで壊れていました。 man
コマンドは doc
と perldoc
への別名です - 全て再び 動作するようになりました。
v5.18.0 のデバッガで導入された対抗が修正され、@_
は正しくデバッガから 見えるようになりました。 [RT #118169]
コピーオンライトビルド (5.20.0 からのデフォルトです) で、${'_<-e'}[0]
がおかしくならなくなりました。 デバッガが 1 行野郎のために保管している入力の最初の行です [perl #118627]。
非スレッドビルドで、${"_<filename"}
にリファレンスや型グロブを 設定しても、__FILE__
や一部のエラーメッセージが壊れた文字列を出力したり 文字列 eval 中の #line
指示子がデバッガにソース行を提供しなくなったり しなくなりました。 スレッド付きビルドでは影響しません。
Perl 5.12 から、#! 行で -d オプションが使われていたときに行番号が 1 ずれていました。 これは正しくなりました。
*DB::DB = sub {} if 0
としても、Perl のデバッグモードが DB::DB
サブルーチン宣言を探すのを止めなくなりました。
%{'_<...'}
ハッシュは、配列 @DB::dbline
が別名になっているものではなく、 対応する @{'_<...'}
にブレークポイントが設定されるようになりました。 [perl #119799]
$DB::sub を設定するときに set-magic を呼び出します。 [perl #121255]
デバッガの "n" コマンドは、左辺値サブルーチンとそれのステップオーバーを 認識するようになりました [perl #118839]。
レキシカル定数 (my sub a() { 42 }
) はインライン化されても クラッシュしなくなりました。
レキシカルサブルーチンに指定されたパラメータプロトタイプは、かっこなしの サブルーチン呼び出しのコンパイル時に認識されるようになりました。 以前は、プロトタイプはかっこ 付き の呼び出しのみで認識されていました。 [RT #116735]
レキシカルサブルーチンの文法エラーと同じサブルーチンの呼び出しの組み合わせで コンパイル時にクラッシュを引き起こさなくなりました。
深い再帰の警告はレキシカルサブルーチンをクラッシュしなくなりました。 [RT #118521]
dtrace sub-entry プローブはレキシカルサブルーチンでもクラッシュせずに 動作するようになりました [perl #118305]。
インライン化可能なレキシカルサブルーチンを未定義化すると (my sub foo() { 42 } undef &foo
) 警告が有効のときにクラッシュしていました。
継承されたメソッドとして使われた未定義のレキシカルサブルーチンは クラッシュしなくなりました。
"CORE" という名前のレキシカルサブルーチンがいても CORE:: 接頭辞の動作を 止めなくなりました。
struct pmop
の全ての場合で OP 割り当てコードは正しく位置合わせされた メモリを返すようになりました。 以前は 4 バイト境界にのみ位置合わせされたメモリを返していました; これは 一部の 32 ビットプラットフォームで 64 ビットの IV を持つ ithread ビルドで 正しくありません。 特に、これにより sparc GNU/Linux で完全にビルドに失敗していました。 [RT #118055]
スカラコンテキストでの大きなハッシュの評価は遥かに高速になりました; ハッシュ中の使っているチェーンの数は大きなハッシュでは キャッシュされるようになったからです。 より小さいハッシュではこれを保管せずに必要になったときに計算し、1 IV を 節約します。 これにより、ハッシュから構築されたオブジェクト毎に IV 1 個のオーバーヘッドが あります。 [RT #114576]
Perl v5.16 では不注意で、コンパイル時には見えない XSUB の呼び出しは 左辺値として扱われ、たとえサブルーチンが左辺値サブルーチンでなくても 代入できるというバグが導入されていました。 これは修正されました。 [RT #117947]
Perl v5.18.0 では、文字列部分に空文字列を、数値部分で非 0 の値が設定されている 2 重変数は真として扱われるようになっていました。 以前のバージョンではこれは偽として扱われ、文字列表現が優先されていました。 古い振る舞いは復旧されました。 [RT #118159]
Perl v5.12 から、同じ名前の組み込みキーワードをオーバーライドした定数を インライン化すると、use subs
を撤回して、引き続く定数への言及で 代わりに組み込みキーワードを使うようになっていました。 これは修正されました。
-l $handle
によって生成される警告は、単にグロブリファレンスに対してでなく、 IO リファレンスとグロブに適用されるようになりました。 また、この警告は UTF8 クリーンになりました。 [RT #117595]
delete local $ENV{nonexistent_env_var}
はメモリリークしなくなりました。
sort
または require
に CORE::
を前置したキーワードが引き続くと、 サブルーチンやモジュールの名前ではなくキーワードとして 扱われるようになりました。 [RT #24482]
ある種の難問によって、現在のパッケージが解放されるようにすることが 可能です。 一部の演算子 (bless
, reset
, open
, eval
) はこれに対応できずに クラッシュしていました。 これらはより弾力的になりました。 [RT #117941]
グロブからグロブへの代入によるファイルハンドルの別名化は、ファイルハンドルと 同じ名前のパッケージがあると、内部メソッドキャッシュが適切に更新されず、 ファイルハンドル内のメソッド呼び出しがパッケージに向かっていました。 これは修正されました。
./Configure -de -Dusevendorprefix
はデフォルトではありませんでした。 [RT #64126]
Statement unlikely to be reached
警告は perldiag で exec
カテゴリの 警告として扱われていましたが、syntax
カテゴリによって有効化および 無効化されていました。 一方、exec
カテゴリではこれらを致命的エラーにするかどうかを 制御していました。 これは全体的に exec
カテゴリで扱われるようになりました。
tr///
と y///
に対する "Replacement list is longer that search list" 警告は /c
フラグがあるときには起こらなくなりました。 [RT #118047]
NV の文字列化はキャッシュされなくなったので、レキシカルなロケールが小数点の 文字列化を制御するようになりました。 [perl #108378] [perl #115800]
Perl のロケールの扱いに関するいくつかの修正が行われました。 perl #38193 は既に "Internal Changes" に記述されています。 基数 (小数点) 文字が ASCII 文字である必要がある (これは一部の非西洋言語では 動作しません) #118197、POSIX::setlocale()
の失敗時に undef
が 返されたとき、警告が有効でも未定義警告が出なかった問題である #115808 が 修正されました。
3 番目の引数が 0 に評価される名前付き定数の split
演算子のコンパイルは 定数値の変更を引き起こさなくなりました。
index
の 2 番目の引数として使われた名前付き定数は、それがリファレンス、 正規表現、2 重変数などの場合に文字列に変換されなくなりました。
未定義値に評価される名前付き定数が index
の 2 番目の引数として使われたとき、 コンパイル時に "uninitialized" 警告を出力しなくなりました。 これは実行時にはまだ出力されます。
@INC 内のサブルーチンからスカラが返されたとき、参照されたスカラはマジカルに IO ものに変換されて、このスカラが他の場所で使い続けられると "Bizarre copy" エラーが起こることがありました。 Perl はこのスカラの内部コピーを使うようになりました。
@a = sort @a
のような sort
演算子のある種の使用法では、その場で配列を 修正するように最適化されます。 ソートの間、この配列は読み込み専用になります。 ソートブロックが die した場合も、この配列は sort
の外側でも 読み込み専用のままになっていました。 これは修正されました。
ソートブロックの内側の $a
と $b
は sort
の実際の引数への別名と なるので、これらは二つの変数を通して変更できます。 これは、例えば左辺値サブルーチンと $#ary
、およびおそらくその他の多くの 演算子では動作していませんでした。 これは動作するようになりました。
sort
の引数は全てリストコンテキストになりました。 sort
が無効またはスカラコンテキストで呼び出された場合、常にではありませんが 時々 引数が無効またはスカラコンテキストになっていました。
U+00FF を超える Unicode 文字のサブルーチンプロトタイプは、クロージャの クローン中に壊れていました。 これは外側で宣言された変数を閉じ込めているサブルーチンと、レキシカル サブルーチンで起きていました。
UNIVERSAL::can
は、最初の引数をメソッド呼び出しが行うのと同じように 扱うようになりました: 空でない IO スロットを持つ型グロブとグロブリファレンスは ハンドルとして扱われ、文字列は、その名前のハンドルが存在していれば、 パッケージではなくファイルハンドルとして扱われます [perl #113932]。
(*ARGV->getline
のような) 型グロブに対するメソッド呼び出しは、 型グロブを文字列化してからもう一度検索していました。 Perl 5.18.0 での変更と組み合わせると、これにより *foo->bar
は (foo->bar
のように) "foo" パッケージの メソッドを呼び出していました。 場合によっては間違ったハンドルに対してメソッドが呼び出されていました。 型グロブ引数は ((\*foo)->bar
と同様) ハンドルとして扱われ、 IO スロットが空なら、エラーが発生するようになりました。
v 文字列の、tie された変数および、存在しないハッシュや配列の要素への別名に なっているサブルーチン引数への代入は、v 文字列を通常の文字列に 平坦化することなく動作するようになりました。
pos
, tie
, tied
, untie
は、存在しないハッシュと配列の要素への 別名であるサブルーチン引数で正しく動作していませんでした [perl #77814, #27010]。
=>
太矢印演算子は、次の行にあっても組み込みキーワードを クォートするようになりました; これにより他の裸の単語の扱い方と 一貫性を持つようになりました。
Perl 5.18.0 から、$glob が単に実際のグロブのコピーのとき、つまりそれに 代入されたグロブであるスカラのとき、\&$glob
経由でサブルーチンスタブを 自動有効化するとクラッシュしていました。 これは修正されました。 [perl #119051]
ある種の演算子の返り値を参照するとき、実装の詳細を漏洩していました。 for ($a+$b) { warn \$_; warn \$_ }
は、\
演算子は変数をコピーするので、 二つの異なるメモリアドレスを表示していました。 スレッド付きビルドでは、これは定数(for(1) { ... }
) でも起きていました。 これは修正されました。 [perl #21979, #78194, #89188, #109746, #114838, #115388]
範囲演算子 ..
は、foreach
ループのヘッダに単一で書かれていない限り、 呼び出し毎に同じ変更可能なスカラを返していました。 これは、リストの中の変数の変更が次に演算子が実行されるときに 見えるということです。 [perl #3105]
定数畳み込みとサブルーチンのインライン化によって、通常新しい修正可能なスカラを 返す操作で代わりに読み込み専用の値を返す問題が修正されました。
sub () { $some_variable }
形式のクロージャはもはや インライン化されなくなりました; 変数の変更がサブルーチンの呼び出し側から無視されていました。 [perl #79908]
ref
のようなある種の演算子の返り値は同じサブルーチンの再帰呼び出しの間で 共有されることがあり、外側での ref
の呼び出しで返された値が内側の呼び出しで 変更されることがありました。 これは修正されました。
__PACKAGE__
とパッケージ名やハッシュキーを返す定数は一貫して 読み込み専用になりました。 以前の様々な Perl リリースでは、ある種の状況では変更可能になっていました。
"used once" 警告を有効にしたときに、コンパイル時に作られたスタッシュの 循環参照 (*Foo::Bar::Foo:: = *Foo::
) でクラッシュしなくなりました。
ハッシュキーに使われた未定義定数 (use constant u => undef; $h{+u}
) は もはやコンパイル時に "uninitialized" 警告を出力しなくなりました。
置換の置き換え部の内側の置換ターゲットを変更してもクラッシュしなくなりました。
文字列 eval の内側の最初の文は、定数畳み込みの間間違ったプラグマ設定を 使っていました。 eval 'uc chr 0xe0'
は Unicode、バイト、ロケール意味論をランダムに 選択していました。 これは修正されました。
@INC フィルタ (@INC 内のサブルーチンから返されたサブルーチン) の返り値の 扱いがいろいろ修正されました。 以前は tie された変数は扱いが間違っていて、$_ にリファレンスや型グロブを 設定するとクラッシュしていました。
SvPVbyte
XS 関数は、文字列以外の何かを返す tie されたスカラで 動作するようになりました。 以前は SvPV
を返すべき場合で utf8 を返していました。
Perl 5.18.0 では不注意で、デリファレンスされた正規表現に対して --
と ++
を行うとクラッシュして、フラット化したv文字列からの ++
で 停止していました。
bless
の最初の引数が tie されたリファレンスでも "Can't bless non-reference value" で die しなくなりました。
引数付きの reset
は、コピーオンライトスカラ、正規表現、型グロブのコピー、 v 文字列を飛ばさなくなりました。 また、これらや読み込み専用変数に遭遇したとき、同じ名前の配列やハッシュを 飛ばさなくなりました。
引数付きの reset
は型グロブへの別名のスカラを飛ばすようになりました (for $z (*foo) { reset "z" }
)。 以前はメモリを壊したりクラッシュしたりしていました。
ucfirst
と lcfirst
は bytes プラグマを認識していませんでした。 これは Perl 5.12 からの退行でした。 [perl #117355]
UNIVERSAL::DESTROY
を変更したとき、古いサブルーチンを使い続けるために既に 破壊されたオブジェクトを持つクラスだけではなく、全てのクラスの DESTROY キャッシュを更新するようになりました。 これは Perl 5.18 での退行でした。 [perl #114864]
Perl 5.18.0 から追加された "Useless use of '\'; doesn't escape metacharacter '%c'" 廃止予定警告に関する、 知られている全ての偽陽性警告が削除されました。 [perl #119101]
Windows で $^E の値はシグナルハンドラの間で保存されるようになりました。 [perl #85104]
(open my $fh...
のような)レキシカルファイルハンドルは、普通は現在の パッケージと変数の名前を元にした名前が与えられます; 例えば "main::$fh"。 再帰したとき、ファイルハンドルの名前のうち "$fh" の部分が失われていました。 これは修正されました。
XSUB から返された未初期化値は未初期化警告から免れなくなりました。 [perl #118693]
elsif ("")
は誤って無効コンテキストに関する警告が出力されなくなりました。 [perl #118753]
サブルーチンに undef
を渡すと、undef
が返すのと同じ読み込み専用の 未定義値が @_ に含まれるようになりました。 さらに、exists $_[0]
は、最初の引数が undef
のときに真を 返すようになりました。 [perl #7508, #109726]
サブルーチンに存在しない配列要素を渡すと、普通はサブルーチンが引数を 変更するまで自動有効化されません。 これは、負のインデックスと配列に存在しない要素では正しく 動作していませんでした。 要素は直ちに有効化されていました。 遅延自動有効化はこれらで動作するように拡張されました。 [perl #118691]
@foo 配列が解放された後、リファレンスやグロブを $#foo によって返された スカラに代入しても、デバッグビルドではアサート失敗を、通常ビルドでは メモリリークを引き起こさなくなりました。
64 ビットプラットフォームで、1..1000000000000 のような大きな範囲は クラッシュしなくなりました; しかしメモリは使い尽くします。 [perl #119161]
__DATA__
は、たとえ現在のパッケージがグロブ代入によってリネームされていても 正しいパッケージに DATA
ハンドルを置くようになりました。
die
, last
, next
, redo
, goto
, exit
がスコープを巻き戻すとき、 現在終了しようとしているサブルーチンやフォーマットの DESTROY
が再帰的に 予備される可能性がありました。 この場合、サブルーチンの内側のレキシカル変数が、未定義になるべきところで 外側の呼び出しからの値を持つようになることがありました。 これは修正されました。 [perl #119311]
${^MPEN} はもはや ${^MATCH} の同義語として扱われなくなりました。
Perl は (caller)[2]
で正しい行番号を返すためにもう少し 努力するようになりました。 [perl #115768]
複数行のクォート風演算子の内側の行番号を正しく報告するようになりました。 [perl #3643]
クォート風演算子に埋め込まれたコードの内側の #line
指示子が 認識されるようになりました。
二つのヒヤドキュメントマーカーが同じ行にあるときに、二つ目のヒヤドキュメントの 内側の行番号が正しくなりました。
Perl 5.18 の最適化は間違った仮定をしていて、Devel::CallParser CPAN モジュールで間違った相互作用を引き起こしていました。 モジュールが読み込まれてから、my(...)
に引き続く別の文でレキシカル変数を 宣言すると、スコープの終了時にクリアに失敗することがありました。
&xsub
と goto &xsub
の呼び出しは、呼び出しサブルーチンに @_ の 自動有効化要素を許すようになりました。
&xsub
と goto &xsub
は、*_ が未定義で ARRAY ない (つまり @_ が 存在しない) 場合でもクラッシュしなくなりました。
&xsub
と goto &xsub
は tie された @_ で動作するようになりました。
長すぎる識別子でバッファオーバーフロー (およびクラッシュ) を 引き起こさなくなりました。 これは Perl 5.18 からそうなっていました。
"Scalar value @hash{foo} better written as $hash{foo}" 警告は、偽陽性が 遥かに少なくなりました。 特に、@hash{+function_returning_a_list}
と @hash{ qw "foo bar baz" }
は 警告されなしました。 同じものは配列スライスにも適用されました。 [perl #28380, #114024]
$! = EINVAL; waitpid(0, WNOHANG);
は内部の無限ループを 引き起こさなくなりました。 [perl #85228]
ファイルハンドルの複製で起こりえるセグメンテーションフォルトは修正されました。
@INC 内のサブルーチンは、ファイルの初期化内容を含むスカラへのリファレンスを 返せます。 しかし、このスカラはどこからも参照されていないと解放が早すぎて、ランダムな 結果になります。
last
は同じ文が蓄積していた値を返さなくなりました; 特にこれにより、 push @a, last
が @a を返そうとして、これをプロセス中のスカラのように コピーして、"Bizarre copy of ARRAY in last." というエラーになっていました。 [perl #3112]
場合によっては、プロセスに対して開かれて、標準ハンドルに複製された ファイルハンドルを閉じると、pid 0 で perl の内部の waitpid ラッパーを 呼び出します。 [perl #85228] の修正によりこの PID 0 は waitpid
に渡され、プロセスが ブロックする可能性があります。 この、プロセス 0 を待つことは起きなくなりました。 [perl #119893]
select
は 4 番目の(タイムアウト) 引数のマジックを無視していたので、 select
が想定されたスリープ時間ではなく無限にブロックされるといったことが 引き起こされていました。 これは修正されました。 [perl #120102]
for my class $foo
のクラス名は正しくパースされるようになりました。 クラス名の 2 番目の文字が数字に引き続いていた場合 (例えば 'a1b')、 これは "Missing $ on loop variable" エラーが発生していました。 [perl #120112]
Perl 5.18.0 では誤って use strict
と use integer
の元では -bareword
が許可されていませんでした。 これは修正されました。 [perl #120288]
行の先頭の -a
(またはファイルテスト演算子でないハイフンと任意の 1 文字) で 間違った 'Use of "-a" without parentheses is ambiguous' 警告を 出力しなくなりました。 [perl #120288]
左辺値コンテキストは、裸のブロックおよび、左辺値サブルーチンの if
と else
ブロックに適切に伝搬するようになりました。 以前は、配列やハッシュは、左辺値リストコンテキストで返された場合に 時々間違って平坦化されたり、"Bizarre copy" エラーが起こっていたりしました。 [perl #119797]
左辺値コンテキストは ||
と &&
(およびその英字の等価物である or
と and
) の枝に伝搬するようになりました。 つまり、foreach (pos $x || pos $y) {...}
は $_ を通して pos
を 変更できるようになりました。
stat
と readline
は最後に使ったハンドルを覚えています; 前者は特殊な _
ファイルハンドル、後者は ${^LAST_FH}
です。 *foo が stat
または readline
に渡された最後のハンドルのとき、 eval "*foo if 0"
とすると、このハンドルがまだ開かれていないと、 忘れられることがありました。 これは修正されました。
delete $::{a}
, delete $::{ENV}
などの様々な場合のクラッシュは 修正されました。 [perl #54044]
require
を呼び出す前に $!
に EACCESS を設定すると require
の振る舞いに 影響することがありました。 これは修正されました。
"Can't use \1 to mean $1 in expression" 警告メッセージは、置換の右側 (置き換え)部でのみ起こるようになりました。 以前は左側や、その他のクォート風演算子に組み込まれたコードで起きることが ありました。
リファレンスへの bless (bless $thisref, $thatref
) は長い間 許されていませんでしたが、2 番目の引数として $/
のようなマジカル変数や tie されたものについては免れていました。 これは許されなくなりました。 [perl #119809]
クラス引数が古いメソッドキャッシュを持つ (つまり最後のメソッド呼び出しの後に 定義されたサブルーチンがあるクラス) bless されたリファレンスのとき、 リファレンスへの bless は誤って許されていました。 これは再び 5.16 と同様に許されなくなりました。
$x が my Class $x
と宣言されているときに、Class::FIELDS が宣言されていても $x->{key}
がクラッシュしなくなりました。
@$obj{'key'}
と ${$obj}{key}
はコンパイル時のフィールドチェック ("No such class field"; fields を参照してください) から免れていましたが、 修正されました。
大きなインデックスの存在しない配列要素を配列に tie されたサブルーチンに 渡してから、その要素にアクセスしてもクラッシュしなくなりました。
現在のパッケージが tie された配列クラスのときに NEGATIVE_INDICES と言う名前の サブルーチンを宣言しても負数の配列インデックスのクラッシュを 起こさなくなりました。
CORE::GLOBAL:: パッケージで require
, glob
, do
サブルーチンスタブを 宣言しても、対応する関数の呼び出しのコンパイルでクラッシュしなくなりました。
Perl 5.10 から、CORE::GLOBAL:: 関数から定数への別名は動作していませんでしたが 修正されました。
`...`
または qx/.../
がオーバーライドされた readpipe
を呼び出すとき、 オーバーライドされていないときと同様に、ダブルクォート風の変数展開が 起こるようになりました。 以前は、オーバーライドが存在すると、クォート風演算子は変数展開を抑制した q{}
のように動作していました。 [perl #115330]
<<<`...`
ヒヤドキュメント (デリミタとして逆クォート) は オーバーライドされた readpipe
を呼び出すようになりました。 [perl #119827]
&CORE::exit()
と &CORE::die()
は vmsish ヒントを 認識するようになりました。
同じグロブを未定義化する DESTROY メソッドを引き起こすグロブを未定義化しても 安全になりました。 以前は "Attempt to free unreferenced glob pointer" 警告が発生してメモリが リークしていました。
サブルーチンの再定義 (eval 'sub foo{}'
や XS コードでの newXS
) が 再定義されたサブルーチンの DESTROY メソッドを引き起こし、そのメソッドが同じ スロットにサブルーチンを代入する場合 (*foo = sub {}
)、$_[0]
は解放された スカラを指したままにならなくなりました。 DESTROY は新しいサブルーチンが設定されるまで遅延されるようになりました。
Windows では、ソケットハンドルに対して CloseHandle() を呼び出さなくなりました。 ある種の無関係な間違ったハンドルの例外を取り除くことで、Windows での デバッグがより容易になりました。 これはまた、複数の OS スレッドを使う Perl プロセスでソケット関数が ランダムに失敗する競合条件と、dist/IO/t/cachepropagate-tcp.t でテストが 失敗することがある問題も修正します。 [perl #120091/118059]
UTF-8 エンコードされた文字列に関するフォーマット、tie、オーバーロード、 文字列化されたリファレンス (および最近の perl ではピュア NOK 変数) のような 変わった変数は、フォーマットの中で ^<<<~~
や同様のもので文字列として 扱われて繰り返し chop されると、一般的に間違ったことをしていました。 これは解決されました。 [perl #33832/45325/113868/119847/119849/119851]
64 ビットビッグエンディアンシステムで、semctl(..., SETVAL, ...)
は 指定された整数の下位 32 ビットではなく上位 32 ビットをセマフォに 設定していました。 [perl #120635]
readdir()
はエラーのときにのみ $!
を設定するようになりました。 ディレクトリから終端の undef
を読み込んだとき、システムコールが $!
を設定しない限りは、$!
に EBADF
を設定しなくなりました。 [perl #118651]
&CORE::glob
は perl のスタックが壊れることによる断続的なクラッシュを 引き起こさなくなりました。 [perl #119993]
("<:encoding(utf8)" のような) モジュールを読み込む層を使った open
で、 スタック破壊によるクラッシュのリスクがなくなりました。
Perl 5.18 では、->SUPER::foo
メソッド呼び出しによるオーバーロードは、 AUTOLOAD を現在のパッケージのスーパークラスではなく現在のパッケージから 検索していたので、動作していませんでした。 これは修正されました。 [perl #120694]
do {} until CONSTANT
で定数が真の値を保持しているときに割り当てられていない メモリを読むという、長い間あったバグが解決しました。 これは普通は文法エラーの後に起きます。 以前のバージョンの Perl では時々クラッシュしていました。 [perl #72406]
HP-UX での $!
の失敗が修正されました。 HP-UX の strerror() は不明なエラーコードに対して空文字列を返します。 これにより、DEBUGGING ビルドではアサートに失敗していました。 "$!"
のために返される文字列は、不明なエラーに対するコードを示すテキストを 含むようになりました。
(tie $INC[0]...
のように) 個別に tie された @INC の要素が正しく 扱われるようになりました。 以前は、そのような tie された要素によって返されるサブルーチンが サブルーチンとして扱われるかどうかは、 FETCH が以前に発生していたかどうかに 依存していました。
getc
演算子が utf8 ハンドルに対して使われた後、同じ getc
が バイト単位のハンドルに対して使われると、バイトを utf8 として扱い、 (不正な UTF-8 警告のような) 誤った振る舞いになっていました。
v5.18 以前は、format の引数行の最初の {
は常にブロックの先頭として 解釈されていました。 Perl v5.18 では、これはあいまいなトークンとして扱われ始めました。 パーサはこれが無名ハッシュのコンストラクタかブロックかを内容によって 推測していました。 以前の振る舞いは復旧されました。 [perl #119973]
Perl v5.18 では undef *_; goto &sub
と local *_; goto &sub
は クラッシュしていました。 これは修正されました。 [perl #119949]
Win32 で逆クォート ( ``
や qx//
) と複数スレッドの組み合わせで、 あるスレッドでの stdout への出力が他のスレッドの外部コマンドの逆クォートで 捕捉されていました。
これは疑似フォークされたプロセスでも起こります; Win32 の疑似フォークは スレッドで実装されているからです。 [perl #77672]
TMPDIR が設定されているけれども一時ファイルを作成できないディレクトリを 指しているときに、open $fh, ">+", undef
はもはや メモリリークしなくなりました。 [perl #120951]
for ( $h{k} || '' )
は $h{k}
を自動有効化しなくなりました。 [perl #120374]
Windows マシンで、ロケールの初期化に POSIX の環境変数の使用を エミュレートするようになりました。 以前は、環境変数は無視されていました。 "ENVIRONMENT" in perllocale を参照してください。
自己参照しているグロブを破壊したときのクラッシュが修正されました。 [perl #121242]
IO::Socket は AIX 5.3 でテストが失敗することが知られています。 request tracker #120835 には パッチ があり、 将来のリリースで適用されるかもしれません。
以下のモジュールはこのバージョンの Perl でテストが失敗することが 知られています。 パッチは提出されているので、うまくいけばすぐに新しいリリースが出るでしょう:
Data::Structure::Util バージョン 0.15
HTML::StripScripts バージョン 1.05
List::Gather バージョン 0.08
リオデジャネイロの 27 歳、Diana Rosa は、いつもコンピュータスクリーンに 表示されていたプラッシュのらくだと共に、2014 年 5 月 10 日、長い眠りに つきました。 彼女は言語とそのコミュニティを愛した情熱的な Perl ハッカーで、Rio.pm の イベントに常に参加していました。 彼女は真のアーティストで、コードを書くことについては熱狂的で、アリアを歌い、 壁に落書きしていました。 私たちは決してあなたを忘れません。
Greg McCarroll は 2013 年 8 月 28 日に死去しました。
Greg は多くの良い理由でよく知られていました。 彼は、最初の YAPC::Europe の主催者の一人でした; これはカンファレンスが 赤字になるのを避けるために彼が必死に値を釣り上げた予定外のオークションで 終わったものです。 london.pm ミーティングに間違って 1 週間遅れて到着したのも Greg でした; 数年後彼は YAPC::Europe オークションで公式ミーティングの日付の選択を 売った一人でした; そして最終的に彼は london.pm の名誉あるリーダーとして、 彼が作り出したばかげた混乱を引き継ぐことになりました。
いつも親切で、親しげで、陽気で楽観的なあなたがいなくなって寂しいですが、決して 忘れません。
Perl 5.20.0 は、Perl 5.18.0 以降、124 人の作者によって、2,900 のファイルに 約 470,000 行の変更を加えて、約 12 ヶ月開発されてきました。
自動生成ファイル、文書、リリースツールを除くと、1,800 の .pm, .t, .c, .h ファイルに約 280,000 行の変更を加えました。
Perl は、活気のあるユーザーと開発者のコミュニティのおかげで 20 年を超えて 繁栄しています。 以下の人々が、Perl 5.20.0 になるための改良に貢献したことが分かっています:
Aaron Crane, Abhijit Menon-Sen, Abigail, Abir Viqar, Alan Haggai Alavi, Alan Hourihane, Alexander Voronov, Alexandr Ciornii, Andy Dougherty, Anno Siegel, Aristotle Pagaltzis, Arthur Axel 'fREW' Schmidt, Brad Gilbert, Brendan Byrd, Brian Childs, Brian Fraser, Brian Gottreu, Chris 'BinGOs' Williams, Christian Millour, Colin Kuskie, Craig A. Berry, Dabrien 'Dabe' Murphy, Dagfinn Ilmari Mannsåker, Daniel Dragan, Darin McBride, David Golden, David Leadbeater, David Mitchell, David Nicol, David Steinbrunner, Dennis Kaarsemaker, Dominic Hargreaves, Ed Avis, Eric Brine, Evan Zacks, Father Chrysostomos, Florian Ragwitz, François Perrad, Gavin Shelley, Gideon Israel Dsouza, Gisle Aas, Graham Knop, H.Merijn Brand, Hauke D, Heiko Eissfeldt, Hiroo Hayashi, Hojung Youn, James E Keenan, Jarkko Hietaniemi, Jerry D. Hedden, Jess Robinson, Jesse Luehrs, Johan Vromans, John Gardiner Myers, John Goodyear, John P. Linderman, John Peacock, kafka, Kang-min Liu, Karen Etheridge, Karl Williamson, Keedi Kim, Kent Fredric, kevin dawson, Kevin Falcone, Kevin Ryde, Leon Timmermans, Lukas Mai, Marc Simpson, Marcel Grünauer, Marco Peereboom, Marcus Holland-Moritz, Mark Jason Dominus, Martin McGrath, Matthew Horsfall, Max Maischein, Mike Doherty, Moritz Lenz, Nathan Glenn, Nathan Trapuzzano, Neil Bowers, Neil Williams, Nicholas Clark, Niels Thykier, Niko Tyni, Olivier Mengué, Owain G. Ainsworth, Paul Green, Paul Johnson, Peter John Acklam, Peter Martini, Peter Rabbitson, Petr Písař, Philip Boulain, Philip Guenther, Piotr Roszatycki, Rafael Garcia-Suarez, Reini Urban, Reuben Thomas, Ricardo Signes, Ruslan Zakirov, Sergey Alekseev, Shirakata Kentaro, Shlomi Fish, Slaven Rezic, Smylers, Steffen Müller, Steve Hay, Sullivan Beck, Thomas Sibley, Tobias Leich, Toby Inkster, Tokuhiro Matsuno, Tom Christiansen, Tom Hukins, Tony Cook, Victor Efimov, Viktor Turskyi, Vladimir Timofeev, YAMASHINA Hio, Yves Orton, Zefram, Zsbán Ambrus, Ævar Arnfjörð Bjarmason.
これはバージョンコントロール履歴から自動的に生成しているので、ほぼ確実に 不完全です。 特に、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 ファイル。