autoderef
機能は取り除かれましたqr/\b{wb}/
は Perl で想定するように調整されましたqr/\N{}/
は use re "strict"
の基では認められなくなりました/\C/
文字クラスは取り除かれましたchdir('')
はホームに chdir しなくなりました$Carp::MaxArgNums
のオフバイワン問題が修正されました(?[...])
の中の [...]
の中にはブランクとタブのみが許されるようになりましたperl5240delta - perl v5.24.0 での変更点
この文書は 5.22.0 リリースと 5.24.0 リリースの変更点を記述しています。
postderef
機能と postderef_qq
機能を使っても警告が発生しなくなりました。 以前使われていた、experimental::postderef
警告カテゴリを無効にしている 既存のコードはそのまま動作します。 postderef
機能は何の効果もありません; 全ての Perl コードは、スコープ内で どの機能が宣言されているかに関わらず、接尾辞デリファレンスを使えます。 5.24
機能バンドルは postderef_qq
機能を含むようになりました。
このリリースによる詳細は、 http://www.unicode.org/versions/Unicode8.0.0/ を参照してください。
今まで、その場編集での出力ファイルを閉じるのに失敗しても 検出されていなかったので、編集が正しく終わらずに入力ファイルが壊れることが ありました。 出力ファイルが正しく閉じられなかった場合、例外が発生するようになりました。
\b{lb}
境界lb
は Line Break の意味です。 これは(典型的には利用可能な横スペースを越えずに出力できるようにするために) テキストの行のどこが分割に適しているかを決定するための Unicode 特性です。 この能力は長い間 Unicode::LineBreak モジュールによって提供されていましたが、 多くの用途に適している、軽量でカスタマイズできない版がコア Perl に 入るようになりました。
qr/(?[ ])/
は UTF-8 ロケールで動作するようになりました拡張大かっこ文字クラス は、use locale
が有効な場所でもコンパイルに成功するようになりました。 コンパイルされたパターンは標準の Unicode の規則を使います。 実行時ロケールが UTF-8 のものではない場合、警告が発生して、どちらにしろ 標準の Unicode の規則が使われます。 結果は実際にはロケールの影響を受けないため、汚染はされません。
<<
と >>
) はより明示的に定義されました負数のシフトは逆シフトです: 左シフトは右シフトに、右シフトは左シフトに なります。
ネイティブな整数のビット数(またはそれ以上)シフトするとゼロになります; ただし use integer
の基で、「オーバーシフト」が負数に対する右シフトの 場合は、結果は -1 になります(算術シフト)。
今まで、負のシフトとオーバーシフトは未定義でした; C の実装で何が起きるかに 依存していたからです。 例えば、過剰シフトについては一般的な C の振る舞いは「剰余シフト」です:
1 >> 64 == 1 >> (64 % 64) == 1 >> 0 == 1 # Common C behavior.
# And the same for <<, while Perl now produces 0 for both.
これらの振る舞いは、基となっている C 実装に関わらず、Perl の基では 定義されたものになりました。 しかし、これはまだネイティブな整数の幅によって制限されることに 注意してください: どれくらいシフトできるか知っている必要があります。 例えば以下のものが使えます:
use Config;
my $wordbits = $Config{uvsize} * 8; # Or $Config{uvsize} << 3.
左シフトでもっと多くのビットが必要なら、例えば bigint
プラグマや、CPAN から Bit::Vector
モジュールが使えます。
つまり、sprintf '|%.*2$d|', 2, 3
は |002|
を返すようになりました。 これは既存の並び替え機構(フォーマットフィールド、幅、ベクタ区切りの引数を 並び替えるもの)を拡張します。
SA_SIGINFO
付きの sigaction
はより多くのフィールドを提供するようになりましたsigaction に SA_SIGINFO
フラグを渡すとき、 プラットフォームが対応していれば、ハンドラに渡されるハッシュに errno
, status
, uid
, pid
, addr
, band
フィールドが 含まれるようになりました。
以前は、シェバンパスがあり、そのパスに "perl" が含まれていない場合、 perl は他のインタプリタにリダイレクトしていました (perlrun 参照)。 Perl 6 との互換性を向上させるために、この振る舞いは、"perl" に引き続いて "6" がある場合もリダイレクトされるように拡張されました。
mkstemp(3)
を呼び出す前に適切な umask を設定するようになりました5.22 から、perl は mkstemp(3)
を呼び出す前に umask を 0600
に設定し、 後で復元するようになりました。 これにより、所有者の読み込みと書き込みのビットだけを残したいという意図とは 逆に、間違って open(2)
に、与えられたモードを適用する前に、 これらのビットを取り除くように伝えていました。
(古いバージョンの glibc のように) mkstemp(3)
でモード 0666 を使う システムはパーミッション 0066 でファイルを作ります; これにより現在の umask に関わらず誰でも読み書きできるパーミッションのままになります。
これは代わりに umask 0177
を使うことによって修正されました。 [perl #127322]
これは CVE-2015-8608 です。 さらなる情報については [perl #126755] を 参照してください。
これは CVE-2015-8607 です。 さらなる情報については [perl #126862] を 参照してください。
crypt()
で未初期化メモリにアクセスしないように短いソルトやソルトの中の不正な文字の検出処理が追加されました。 [perl #126922]
environ
から重複した環境変数を削除するようになりました以前は、一つの環境変数が environ[]
に複数回現れると、 %ENV
はその名前の最後のエントリを保持していました; 一方典型的な getenv()
は最初のエントリを保持します。 %ENV
は getenv()
が返すものと同じものを保持するようになりました。
次に、environ[]
から重複を取り除くようになったので、その名前の設定が %ENV
で設定された場合、安全でない値が子プロセスに渡らないようになりました。
[CVE-2016-2381]
autoderef
機能は取り除かれました実験的な autoderef
機能 (push
, pop
, shift
, unshift
, splice
, keys
, values
, each
をスカラ引数で呼び出せるようにする) は失敗と 判断されました。 これは削除されました; この機能を use しようとすると (または以前は 引き起こされていた experimental::autoderef
警告を無効にしようとすると) 例外が発生するようになりました。
my $_
は Perl 5.10 で導入され、明らかな解決法の無いまま多くの混乱を 引き起こしました。 Perl 5.18.0 では、取り除くかあるいはより混乱の少ない(しかし後方互換性のある) 形に再設計するために実験的なものとされました。 その後数年にわたって、代替案は提案されませんでした。 この機能は削除され、コンパイルに失敗するようになりました。
qr/\b{wb}/
は Perl で想定するように調整されましたこれは普通の \b
の置き換えとして寄り適していましたが、自然言語の パースのためにより良い結果を出すようになりました。 以前は、全ての空白文字の間でマッチングすることを求めている現在の Unicode の 規則に厳密に従っていました。 これは、\b
が行っているように、基本的には連続した空白の中では マッチングしなくなりました。 "\b{wb}" in perlrebackslash を参照してください。
実行時エラーになっていた一部の正規表現パターンは コンパイルできないようになりました。
\p{}
と \P{}
の正規表現パターン構文を使っているほとんどの全ての Unicode 特性は、パターンのコンパイル時に正当性を調べるようになり、不正な場合は プログラムがコンパイルされなくなりました。 以前のリリースでは、この検査はしばしば実行時にまで保留されていました。 エラー検査が実行時からコンパイル時に移動しても、間違ったコードはその時点で 100% 捕捉されます; 一方、以前は間違いは問題が実際に実行されるときに 捕捉されていたので、到達しないコードのものは決して捕捉されていませんでした。
qr/\N{}/
は use re "strict"
の基では認められなくなりました空の \N{}
は無意味ですが、後方互換性のために何もしないものとして 認められていましたが、デフォルトでは廃止予定警告が出ていました。 今回これは実験的機能 "'strict' mode" in re の基では致命的エラーになりました。
my
, our
, state
宣言は、別の my
, our
, state
宣言の中では 行えなくなりました。
例えば、以下のものは致命的エラーになりました:
my ($x, my($y));
our (my $x);
/\C/
文字クラスは取り除かれましたこの正規表現文字クラスは v5.20.0 から廃止予定になり、v5.22.0 から 廃止予定警告が出力されていました。 これはコンパイルエラーになりました。 UTF-8 エンコードされた文字を構成している個々のバイトを調べる必要があるときは、 まず文字列(またはそのコピー)に対して utf8::encode()
を使ってください。
chdir('')
はホームに chdir しなくなりましたホームディレクトリへ移動するのに chdir('')
や chdir(undef)
を使うのは perl v5.8 から廃止予定でしたが、失敗するようになりました。 代わりに chdir()
を使ってください。
今まで、ASCII プラットフォームで、非表示 ASCII 制御文字(値 0 から 31 と 127、 つまり C0 制御文字と DELETE
) を含む変数名は正当でした。 この使用法は v5.20 から廃止予定になっていましたが、 今回文法エラーになりました。 これらの名前の変数は特別なものとして扱われ、Perl によって現在、あるいは 将来の使用のために予約されています。 このような変数はそれぞれ表記するための他の方法があります。 単一の非表示制御文字の代わりに、$^]
や ${^GLOBAL_PHASE}
のように、 キャレットから始まる 2 文字並びが使われます。 詳細は perlvar にあります。 use utf8
が有効でない場所である種の非表示非 ASCII 文字を変数に使うのは まだ正当ですが、賢明ではないことで、廃止予定です(廃止予定警告が出ます)。 このような全ての変数は Perl によって予約されていて、Perl は現在のところ どれも定義していない(しかしいつか注意なしに定義するかもしれません)ので、 コード中でこのようなことをするべきではありません。
$Carp::MaxArgNums
のオフバイワン問題が修正されました$Carp::MaxArgNums
は表示する引数の数を保持することになっています。 以前のバージョンでは、文書の説明と異なり、$Carp::MaxArgNums
+ 1 個の引数を 表示していました。
(?[...])
の中の [...]
の中にはブランクとタブのみが許されるようになりました実験的な拡張大かっこ文字クラスは通常の大かっこ文字クラスを含むことが出来ます。 これらは、バックスラッシュを前置してエスケープしない限り、基本的に空白が 無視されるという点で、通常のものとは異なっていました; 無視される空白はタブ \t
と SPACE 文字に制限されるようになりました。 以前は、これは任意の空白でした。 "Extended Bracketed Character Classes" in perlrecharclass を参照してください。
IV_MAX
を越える符号位置の使用は廃止予定になりましたUnicode は 0..0x10FFFF
の範囲の符号位置を定義しています。 一部の標準は一時期この値を 2**31 - 1 まで定義していましたが、Perl は プラットフォームが使えるワードに収まるなら、どんなに大きな値でも 許していました。 しかし、プラットフォームの IV_MAX
より上の符号位置を使うと 一部の構文、特に tr///
、量指定子を含む正規表現パターン、一部の算術および 比較演算子、ループの上限などで壊れていました。 今回、これらの符号位置を使うと、この警告カテゴリをオフにしていない限り、 廃止予定警告が出るようになりました。 IV_MAX
は典型的には 32 ビットプラットフォームでは 2**31 -1、 64 ビットでは 2**63-1 です。
文字列ビット単位演算子はオペランドをバイトとして扱い、0xFF を超える値は このコンテキストでは無意味です。 エンコードされたバイトに対して演算するには、まず文字列をデコードしてください。 符号位置の数値に対して演算するには、split
と map ord
を使ってください。 将来、この警告は例外に置き換えられます。
sysread()
, syswrite()
, recv()
, send()
は廃止予定になりましたsysread()
, recv()
, syswrite()
, send()
演算子は、明示的あるいは 暗黙に :utf8
層を持つ (例えば :encoding(UTF-16LE)
を持つ) ハンドルに 対しては廃止予定になりました。
sysread()
と recv()
は現在のところストリームに対して :utf8
フラグのみを使い、実際の層は無視しています。 sysread()
と recv()
は UTF-8 検証を行わないので、不正にエンコードされた スカラを作る可能性があります。
同様に、syswrite()
と send()
は :utf8
フラグのみを使い、層を 無視します。 フラグが設定されていると、前述の例のように他のエンコーディングの層が あっても、これらは UTF-8 エンコードされた値を書き込みます。
理想的には、これらの演算子は :utf8
状態を完全に無視して、バイトに対してのみ 動作するべきですが、こうすると暗黙に既存のコードを壊すことになります。 これを避けるために、将来のバージョンの perl では :utf8
層を持つハンドルに対して sysread()
, recv()
, syswrite()
, send()
を呼び出すときに例外が投げられます。
スコープの出入りでのオーバーヘッドが大幅に減少したので、例えばサブルーチン 呼び出し、ループ、基本ブロックなどは全てより速くなりました。 この空関数呼び出しは実行時間が 3 分の 1 になりました:
sub f{} f();
中国語など、多くの言語には大文字小文字がありません。 Perl はこれについてもっとも一般的なものについて知るようになり、 プログラムが(ucfirst()
のように)これらの大文字小文字を変えようとしたり (qr//i
のように)大文字小文字を無視してマッチングしようとしたときに 多くの処理を飛ばすようになりました。 これにより、多言語対応の web サーバで大文字小文字のない言語を 処理するようなときに高速化されました。
/固定部分文字列/
は非常に速くなりました。
libc memchr()
実装が基礎となるハードウェア対応をうまく使う プラットフォームでは、固定部分文字列を含むパターンはしばしばとても 高速になりました; 例えば最近の x86_64 CPU で glibc を使うと、以下のものは:
$s = "a" x 1000 . "wxyz";
$s =~ /wxyz/ for 1..30000
約 7 倍速くなりました。 (32 ビット ARM Raspberry Pi のような) memchr()
が遅いシステムでは、 少しだけ高速化します。 逆に、"ab" x 1000 =~ /aa/
のような極端な場合ではより遅くなりました; rPi では 3 倍、x86_64 では 1.5 倍遅くなりました。
加算、減算、乗算は速くなりました。
5.8.0 から、算術演算は 64 ビット整数に対応するために遅くなっていました。 64 ビット整数を扱うためには、とても多くの境界条件を調べる必要があり、 時間が掛かっていました。 今回、これらの境界条件を調べる必要のない一般的な場合を検出して、それを 特別扱いするようになりました。
プレインクリメント、プレデクリメント、ポストインクリメント、 ポストデクリメントは、内部で様々な場合を別の関数に分割することで、 高速化しました。
XSUBs と定数サブルーチンのための Perl デバッガデータ構造体 ("Debugger Internals" in perldebguts 参照) の作成は取り除かれました。 これは、XSUBs と定数サブルーチンがあるユニークな .c
ファイル毎に一つの glob/scalar 組を取り除きます。 起動時に、(perl -e"0"
) およそ半ダースの glob/scalar デバッガ組が 作られていました。 XS モジュールの読み込み時にはより多くの glob/scalar 組が作られていました。 これらは perl デバッガが使われるかどうかに関わらず、どちらにしろ C コードは デバッグできないにも関わらず、作られていました。
Win32 で、パスに対して stat
や -X
を使うとき、そのファイルや ディレクトリが存在しなければ、以前より 3.5 倍速くなりました。
リスト代入での単一の引数は少し速くなりました:
($x) = (...);
(...) = ($x);
正規表現パターンをコンパイルするときに使用するピーク時メモリ消費が 減少しました。
arybase はバージョン 0.10 から 0.11 に更新されました。
Attribute::Handlers はバージョン 0.97 から 0.99 に更新されました。
autodie はバージョン 2.26 から 2.29 に更新されました。
autouse はバージョン 1.08 から 1.11 に更新されました。
B はバージョン 1.58 から 1.62 に更新されました。
B::Deparse はバージョン 1.35 から 1.37 に更新されました。
base はバージョン 2.22 から 2.23 に更新されました。
Benchmark はバージョン 1.2 から 1.22 に更新されました。
bignum はバージョン 0.39 から 0.42 に更新されました。
bytes はバージョン 1.04 から 1.05 に更新されました。
Carp はバージョン 1.36 から 1.40 に更新されました。
Compress::Raw::Bzip2 はバージョン 2.068 から 2.069 に更新されました。
Compress::Raw::Zlib はバージョン 2.068 から 2.069 に更新されました。
Config::Perl::V はバージョン 0.24 から 0.25 に更新されました。
CPAN::Meta はバージョン 2.150001 から 2.150005 に更新されました。
CPAN::Meta::Requirements はバージョン 2.132 から 2.140 に更新されました。
CPAN::Meta::YAML はバージョン 0.012 から 0.018 に更新されました。
Data::Dumper はバージョン 2.158 から 2.160 に更新されました。
Devel::Peek はバージョン 1.22 から 1.23 に更新されました。
Devel::PPPort はバージョン 3.31 から 3.32 に更新されました。
Dumpvalue はバージョン 1.17 から 1.18 に更新されました。
DynaLoader はバージョン 1.32 から 1.38 に更新されました。
Encode はバージョン 2.72 から 2.80 に更新されました。
encoding はバージョン 2.14 から 2.17 に更新されました。
encoding::warnings はバージョン 0.11 から 0.12 に更新されました。
English はバージョン 1.09 から 1.10 に更新されました。
Errno はバージョン 1.23 から 1.25 に更新されました。
experimental はバージョン 0.013 から 0.016 に更新されました。
ExtUtils::CBuilder はバージョン 0.280221 から 0.280225 に更新されました。
ExtUtils::Embed はバージョン 1.32 から 1.33 に更新されました。
ExtUtils::MakeMaker はバージョン 7.04_01 から 7.10_01 に更新されました。
ExtUtils::ParseXS はバージョン 3.28 から 3.31 に更新されました。
ExtUtils::Typemaps はバージョン 3.28 から 3.31 に更新されました。
feature はバージョン 1.40 から 1.42 に更新されました。
fields はバージョン 2.17 から 2.23 に更新されました。
File::Copy はバージョン 2.30 から 2.31 に更新されました。
File::Find はバージョン 1.29 から 1.34 に更新されました。
File::Glob はバージョン 1.24 から 1.26 に更新されました。
File::Path はバージョン 2.09 から 2.12_01 に更新されました。
File::Spec はバージョン 3.56 から 3.63 に更新されました。
Filter::Util::Call はバージョン 1.54 から 1.55 に更新されました。
Getopt::Long はバージョン 2.45 から 2.48 に更新されました。
Hash::Util はバージョン 0.18 から 0.19 に更新されました。
Hash::Util::FieldHash はバージョン 1.15 から 1.19 に更新されました。
HTTP::Tiny はバージョン 0.054 から 0.056 に更新されました。
I18N::Langinfo はバージョン 0.12 から 0.13 に更新されました。
if はバージョン 0.0604 から 0.0606 に更新されました。
IO はバージョン 1.35 から 1.36 に更新されました。
IO-Compress はバージョン 2.068 から 2.069 に更新されました。
IPC::Open3 はバージョン 1.18 から 1.20 に更新されました。
IPC::SysV はバージョン 2.04 から 2.06_01 に更新されました。
List::Util はバージョン 1.41 から 1.42_02 に更新されました。
locale はバージョン 1.06 から 1.08 に更新されました。
Locale::Codes はバージョン 3.34 から 3.37 に更新されました。
Math::BigInt はバージョン 1.9997 から 1.999715 に更新されました。
Math::BigInt::FastCalc はバージョン 0.31 から 0.40 に更新されました。
Math::BigRat はバージョン 0.2608 から 0.260802 に更新されました。
Module::CoreList はバージョン 5.20150520 から 5.20160506 に更新されました。
Module::Metadata はバージョン 1.000026 から 1.000031 に更新されました。
mro はバージョン 1.17 から 1.18 に更新されました。
ODBM_File はバージョン 1.12 から 1.14 に更新されました。
Opcode はバージョン 1.32 から 1.34 に更新されました。
parent はバージョン 0.232 から 0.234 に更新されました。
Parse::CPAN::Meta はバージョン 1.4414 から 1.4417 に更新されました。
Perl::OSType はバージョン 1.008 から 1.009 に更新されました。
perlfaq はバージョン 5.021009 から 5.021010 に更新されました。
PerlIO::encoding はバージョン 0.21 から 0.24 に更新されました。
PerlIO::mmap はバージョン 0.014 から 0.016 に更新されました。
PerlIO::scalar はバージョン 0.22 から 0.24 に更新されました。
PerlIO::via はバージョン 0.15 から 0.16 に更新されました。
podlators はバージョン 2.28 から 4.07 に更新されました。
Pod::Functions はバージョン 1.09 から 1.10 に更新されました。
Pod::Perldoc はバージョン 3.25 から 3.25_02 に更新されました。
Pod::Simple はバージョン 3.29 から 3.32 に更新されました。
Pod::Usage はバージョン 1.64 から 1.68 に更新されました。
POSIX はバージョン 1.53 から 1.65 に更新されました。
Scalar::Util はバージョン 1.41 から 1.42_02 に更新されました。
SDBM_File はバージョン 1.13 から 1.14 に更新されました。
SelfLoader はバージョン 1.22 から 1.23 に更新されました。
Socket はバージョン 2.018 から 2.020_03 に更新されました。
Storable はバージョン 2.53 から 2.56 に更新されました。
strict はバージョン 1.09 から 1.11 に更新されました。
Term::ANSIColor はバージョン 4.03 から 4.04 に更新されました。
Term::Cap はバージョン 1.15 から 1.17 に更新されました。
Test はバージョン 1.26 から 1.28 に更新されました。
Test::Harness はバージョン 3.35 から 3.36 に更新されました。
Thread::Queue はバージョン 3.05 から 3.09 に更新されました。
threads はバージョン 2.01 から 2.07 に更新されました。
threads::shared はバージョン 1.48 から 1.51 に更新されました。
Tie::File はバージョン 1.01 から 1.02 に更新されました。
Tie::Scalar はバージョン 1.03 から 1.04 に更新されました。
Time::HiRes はバージョン 1.9726 から 1.9733 に更新されました。
Time::Piece はバージョン 1.29 から 1.31 に更新されました。
Unicode::Collate はバージョン 1.12 から 1.14 に更新されました。
Unicode::Normalize はバージョン 1.18 から 1.25 に更新されました。
Unicode::UCD はバージョン 0.61 から 0.64 に更新されました。
UNIVERSAL はバージョン 1.12 から 1.13 に更新されました。
utf8 はバージョン 1.17 から 1.19 に更新されました。
version はバージョン 0.9909 から 0.9916 に更新されました。
warnings はバージョン 1.32 から 1.36 に更新されました。
Win32 はバージョン 0.51 から 0.52 に更新されました。
Win32API::File はバージョン 0.1202 から 0.1203 に更新されました。
XS::Typemap はバージョン 0.13 から 0.14 に更新されました。
XSLoader はバージョン 0.20 から 0.21 に更新されました。
文書化されていないグローバル変数を使うための手続きが文書化されました; つまり、 文書化されていない関数やグローバル変数を文書化して使うためのゴーサインを もらうために、まず perl5-porters@perl.org に メールを送るべきです。
以下を含む多くの整理が perlcall に対して行われました:
利用可能でマッチングするときには XPUSHs()
ではなく EXTEND(SP, n)
と PUSHs()
を使うように
POPu, POPul, POPpbytex が「POP マクロの完全なリスト」に追加され、 既存のエントリの文書と副作用に関する注意について明確化
POPu と POPul の API 文書の追加
ERRSV をより効果的に使う
スレッドセーフな SV の保管の手法。
hex
の文章は、有効な入力を明確化するために見直されました。
waitpid
で負の PID の意味の説明が改善されました。 [perl #127080]
一般的な整理: (POD での使用法、文法、コード例で)一貫性の改善、 コード例でのよりよいプラクティス (my
の使用、裸の単語の ファイルハンドルの除去、サブルーチン呼び出し時の &
の使用の除去)などが 行われました。
perl のコンテキストスタックがどのように動作するかを説明する "Dynamic Scope and the Context Stack" in perlguts という章が追加されました。
すれっどを使ったアプリケーションでのロケールの使用についてより強い注意が 与えられました。 ロケールはスレッドセーフではなく、そこでロケールを使うと間違った結果や、 セグメンテーションフォルトが起こることがあります。
モジュールの命名に関するガイドが必要な場合、モジュール作者一覧や PAUSE に当たることを勧めるようになりました。
qx//
の文書に、$?
がどのように影響するかが記述されました。
次の注意が perlpolicy に追加されました:
While civility is required, kindness is encouraged; if you have any
doubt about whether you are being civil, simply ask yourself, "Am I
being kind?" and aspire to that.
strict に対応するように例が修正されました。
日本語やタイ語のような言語では、単語境界を決定するためには辞書検索が 必要であることを明確化しました。
無名サブルーチンがシグネチャを持てることを示すために更新されました。
do/while の例で、==
ではなく =
が使われている壊れた例が修正されました。
FIRSTKEY
と NEXTKEY
の使用法が明確化されました。
Unicode Block 特性を示すために接頭辞として 'In' を使うのは非推奨になりました。
$@
の文書は、単に eval
の文法エラーのためだけのものではないことを 明確化するために修正されました。. [perl #124034]
$!{E...}
の特定の真の値について、変更される可能性があり、保証されないことが 文書化されました。
$OLD_PERL_VERSION
の使用は非推奨になりました。 =back
PROTOTYPES
の文書が修正されました; これはデフォルトでは 有効 ではなく 無効 です。
以下の追加や変更が、警告や致命的エラーメッセージ含む診断出力に行われました。 完全な診断メッセージの一覧については、perldiag を参照してください。
Character following \p must be '{' or a single-character Unicode property name in regex;
Sequence (?... not terminated in regex; marked by <-- HERE in m/%s/
Sequence (?P<... not terminated in regex; marked by <-- HERE in m/%s/
Sequence (?P>... not terminated in regex; marked by <-- HERE in m/%s/
グロブの IO
部を IO
ではなく FILEHANDLE
としてアクセスするのは 廃止予定ではなくなりました。 統一性を進めるためには非推奨です(例えば、より簡単に grep できます)が、 取り除かれはしません。 [perl #127060]
Hexadecimal float: internal error
というメッセージは、より多くの情報を 含むように Hexadecimal float: internal error (%s)
に変更されました。
Can't modify non-lvalue subroutine call of &%s
このエラーは、左辺値として使おうとした非左辺値サブルーチンの名前を 報告するようになりました。
スタックサイズを増やそうとしているときにメモリがなくなると、以前は、perl は panic: av_extend_guts() negative count (-9223372036854775681)
という わかりにくいメッセージで die していました。 これは、より分かりやすいメッセージが出るように修正されました: Out of memory during stack extend
Configure
は、常に -O
オプションが渡されるかのように振る舞い、 コマンドラインオプションで保存された設定を上書きできるようになりました。 これにより、コマンドラインオプションがわかりにくい理由で無視されるという 混乱を取り除けるはずです。 -O
は指定できますが、無視されます。
Bison 3.0 に対応しました。
Configure はもはやデフォルトでは libnm をプローブしなくなりました。 元々はこれは "New Math" ライブラリでしたが、この名前は GNOME NetworkManager によって再利用されました。 [perl #127131]
newlocale
, freelocale
, uselocale
のための Configure プローブが 追加されました。
PPPort.so/PPPort.dll
はインストールされなくなりました; これは PPPort.pm
によって使われておらず、そのテストでだけ使っているからです。
PERL_BUILD_DATE
マクロを設定することで、perl -V
出力で 表示されるコンパイル日を指定できるようになりました。
Perl 5.17.10 から、NO_HASH_SEED
定義をデフォルトのハッシュアルゴリズム PERL_HASH_FUNC_ONE_AT_A_TIME_HARD
と共に使うと、インタプリタの コンパイル時に致命的エラーになっていました。 これは修正されました。
Configure はパスの中のスペースを少しうまく扱えるようになったはずです。
もはや EBCDIC POSIX-BC テーブルは生成されなくなりました。 現在 Perl と POSIX-BC を使っている人はいないはずで、これらのテーブルを 生成しないことで開発中の時間を節約し、結果の tar ball が小さくなります。
Win32 での GNU Make の makefile は並列ビルドに対応しました。 [perl #126632]
Win32 の MSVC++ で GNU Make を使って perl をビルド出来るようになりました。 [perl #126632]
Win32 miniperl はビルド性能を向上させる実際の getcwd
を使うようになり、 getcwd()
は Win32 miniperl では 605 倍高速になりました。
Configure は alignbytes
設定変数を計算するときに -Dusequadmath
を 考慮するようになりました。 以前は alignbytes
の計算を間違えていたので、デバッグビルドで境界 エラーが起こることがありました。 [perl #127894]
リスト代入演算子 OP_AASSIGN
をテストするための新しいテスト (t/op/aassign.t) が追加されました。
dmake の makefile.mk
makefile に、並列ビルドが追加されました。 全ての Win32 コンパイラに対応しています。
Perl 5.22.1 から離れていた AmigaOS 版がメインツリーに再統合されました。
テストは普通でない cygdrive 接頭辞に対してより頑強になりました。 [perl #126834]
UTF-EBCDIC は UTF-8 のようなものですが、EBCDIC プラットフォームのための ものです。 64 ビットワードのプラットフォームでは符号位置を 2 ** 64 - 1 まで 表現できるように拡張されました。 これにより UTF-8 と同等になります。 この拡張は、2 ** 30 から 2 ** 31 -1 の範囲(後者は以前の表現可能な 符号位置の最大値)の符号位置の表現に対して互換性のない変更が必要です。 つまり、以前のバージョンの perl 出力された、これらの符号位置を含むファイルは、 今回の変更を含む perl では、変換なしでは読み込めないということです。 私たちはこのようなファイルが存在するとは思っていませんが、もしそのような ファイルを持っているなら、perlbug@perl.org に チケットを登録してください; 私たちはあなたのために変換スクリプトを書きます。
cmp()
and sort()
fixed for UTF-EBCDIC strings今まで、両方とも UTF-8 (より正確には UTF-EBCDIC) でエンコードされた文字列の 比較は正しく動作していませんでした。 sort()
は cmp()
を使うので、これも修正されました。
tr///
and y///
fixed for \N{}
, and use utf8
rangesPerl v5.22 では移植性のある正規表現パターンの範囲という概念が導入されました。 移植性のある範囲は、どのプラットフォームで実行されるかに関わらず同じ文字の 集合にマッチングします。 この考え方は tr///
に拡張されました。 tr///
を 参照してください。
これらの操作は use utf8
の基で問題がありましたが、修正されました。
利用可能なら、FreeBSD の fdclose()
を使うようになりました。 [perl #126847]
IRIX の stdio の fgetc() と fread() は、ある種の状況で errno に ENOENT
を 設定しますが、IRIX や POSIX の文書によればこれは無意味なものです。 errno はこのような場合ではクリアされるようになりました。 [perl #123977]
long double に無限を掛けたときの問題が修正されました。 [perl #126396]
今まで、perl の OS X ビルドはリンクターゲットとして 10.3 (2003 年の Panther)を 指定していましたが、コンパイラターゲットは指定していませんでした。 今回から、OS X 10.6 (Snow Leopard, 2008 年) 以降でビルドする場合は、 デフォルトでは現在の OS X バージョンを捕捉して、これをコンパイラとリンカの フラグで明示的なビルドターゲットとして指定します。 従って、OS X, SDK, コンパイラやリンカのバージョンに関わらず、後にビルドする エクステンションのバイナリ互換性は維持されます。 ビルド時に使われてフラグに保存されているデフォルト値を上書きするには、 perl の設定とビルドの前に export MACOSX_DEPLOYMENT_TARGET=10.N
を 指定してください; ここで 10.N はターゲットにしたい OS X のバージョンです。 OS X 10.5 以前では、そのシステムがカレントなら現在の振る舞いに 変更はありません; リンクターゲットは OS X 10.3 のままで明示的な コンパイラターゲットはありません。
-DDEBUGGING とスレッドの両方を有効にしたビルドは、OS X の Terminal で ビルドやテストをすると "panic: free from wrong pool" で失敗します。 これは、perl 内部の環境管理が、環境を更新するために libc の setenv()
関数を 使う atfork ハンドラと競合するからです。
Perl は OS X の環境の更新に setenv()
/unsetenv()
を使うようになりました。 [perl #126240]
全ての Solaris の亜種で共有 libperl をビルドするようになりました。
Solaris と OpenIndiana のような亜種では、常に共有 Perl ライブラリで (Configure -Duseshrplib) ビルドされるようになりました。 これは OpenIndiana ビルドで必要でしたが、何年も前から Oracle/Sun Perl ビルドでも設定されていました。
Workaround where Tru64 balks プロトタイプが PERL_STATIC_INLINE
に載っているけれども、テストが -DPERL_NO_INLINE_FUNCTIONS
付きでビルドされた場合に Tru64 を妨げる 問題が回避されました。
VMS では、math.h
の算術関数プロトタイプは C++ で見えるようになりました。 C++ で POSIX エクステンションをビルドしてもクラッシュしなくなりました。
VMS は、(1996 年にリリースされた) v7.0 から setenv
/unsetenv
があります。 Perl_vmssetenv
は常に setenv
/unsetenv
を使うようになりました。
今回 Perl は指定されたプロセスグループのプロセスをスキャンするための独自の killpg
を実装しました; これは Unix プロセスグループと正確に同じことを 意味するわけではありませんが、親(マスター)プロセスとその全ての副プロセスに シグナルを送ることができるようになります。 perl のレベルでは、これは次のようにして負数の pid を送ることができると いうことです:
kill SIGKILL, -$pid;
これは $pid
と同じグループの全てのプロセスにシグナルを送ります。
CRTL 環境配列を基にした %ENV
要素では、値を設定するときには常に 大文字小文字を保存しますが、検索時にはキーをまず大文字にしてからのみ 行っていて、小文字や大文字小文字の混ざったエントリは 見つけられていませんでした。 環境配列由来の %ENV
要素に関しては保管時に大文字小文字を保存するのと同様 検索時にも大文字小文字を認識するようにすることで、この問題は修正されました。
PERL5LIB
と PERLLIB
の環境変数検索は、以前は論理名としてのみ 扱われていましたが、今回から %ENV
の全てのソースは PERL_ENV_TABLES
によって決定されるものと "%ENV" in perlvms で 文書化されているものとして扱われるようになりました。
VMS で対応する最低バージョンは、2003 年にリリースされた v7.3-2 になりました。 この変更の副作用として、VAX はもはや対応されなくなりました; OpenVMS VAX の 最後のリリースは 2001 年の v7.3 です。
新しいビルドオプション USE_NO_REGISTRY
が makefile に追加されました。 このオプションはデフォルトではオフです; これは、デフォルトでは Windows の レジストリ検索を行うということです。 このオプションは、Perl がレジストリの内部を見ることを止めさせます。 レジストリのどの値を見るかについては perlwin32 を参照してください。 内部の扱いとしては、C では、このオプションの名前は WIN32_NO_REGISTRY
です。
PERL
で始まる %ENV
変数を含むいくつかの値を探すのに HKEY_CURRENT_USER\Software\Perl
と HKEY_LOCAL_MACHINE\Software\Perl
を 使うという Perl の振る舞いは変更されました。 以前は、この二つのキーは perl のプロセスの動作中ずっと、例えキーが 存在していなくても、チェックされ続けていました。 性能上の理由から、もしルートキー (つまり HKEY_CURRENT_USER\Software\Perl
や HKEY_LOCAL_MACHINE\Software\Perl
) が プロセス開始時に存在していなければ、残りの perl プロセスの動作中、 %ENV
上書きエントリのために再びチェックしなくなりました。 これは、環境は開始時にコピーまたは継承して、親プロセスや他のプロセスで 変数を変更したり .bashrc を編集したりしても、他の存在している、 実行されているプロセスの環境変数は変更されないという、Unix での振る舞いに より近いものになります。
Perl のコードまたは内部では Perl の C コードのどちらかによる、 -X
または stat
呼び出し毎に行われていた一つのグロブ取得が 取り除かれました。 取得していたグロブは特殊変数である ${^WIN32_SLOPPY_STAT}
でした。 これにより -X
と stat
は少し速くなりました。
miniperl のプロセスの起動中、ビルドプロセスの間、 最初の 1 または 2 の .pl ファイルに対しては、.pl と buildcustomize.pl ファイルの開始プロセスに関連する 4 から 8 の IO 呼び出しがコードから取り除かれました。
Microsoft Visual C++ 2003 以前を使ったビルドで "INTERNAL COMPILER ERROR" メッセージが出なくなりました。 [perl #126045]
Visual C++ 2013 ビルドは XP 以降で実行できるようになりました。 以前は Vista 以降でのみ実行できました。
perl を GNU Make と GCC でビルド出来るようになりました。 [perl #123440]
truncate($filename, $size)
はサイズが 4GB 以上のファイルで 動作するようになりました。 [perl #125347]
dmake の makefile.mk
makefile に、並列ビルドが追加されました。 全ての Win32 コンパイラに対応しています。
64 ビット GCC と 32 ビット gmake で 64 ビット perl をビルドすると、 作成された perl の $Config{archname}
が不正になっていました。 [perl #127584]
Winsock 関数によって設定されたエラーは直接 $^E
に設定されるようになり、 関連する WSAE*
エラーコードは、これをテストするために Errno と POSIX モジュールからエクスポートされるようになりました。
エラーを (Perl 5.20.0 からは POSIX 形式の E*
エラーコードに変換して) $!
に設定するという以前の振る舞いは、不幸にも Perl 5.8.0 から何かにつけて 設定されていた、似た名前の Winsock と POSIX のエラー定数の非等価性により、 バギーでした。
新しい振る舞いは、移植性のあるソフトウェアが、他の OS を意図した POSIX テストと、異なった意味を持つかもしれない Winsock のものが 偶然一致してしまうことなく Winsock のエラーをチェックするのに、はるかに頑強な 解決法を提供します。
古い振る舞いは今のところ後方互換性のために欠点も含めてそのまま残っていますが、 Winsock エラーについて $!
を E*
定数でテストするのではなく、 $^E
を WSAE*
定数でテストするように変更することが推奨されます。 適切な廃止予定期間の後、古い振る舞いは取り除かれ、エラー変数のチェックに 関する混乱を防ぐために、Winsock 関数呼び出しの後に $!
が 変更されなくなります。
ppc64el (リトルエンディアン PowerPC の Debian での呼び名) の浮動小数点形式は 正しく検出されるようになりました。
perl コンテキストスタックシステムとその内部 API は大きく再作業されました。 外部 API には大きな変更はありませんが、このような内部詳細に依存している XS コードは修正する必要があります。 主な変更点は以下の通りです:
PUSHBLOCK()
, POPSUB()
などのマクロは cx_pushblock()
, cx_popsub()
などの静的インライン関数に置き換えられました。 これらは、gimme
や newsp
のような利用可能なローカル変数に暗黙に 依存するのではなく、関数の引数を使います。 また、これらの機能は変更されました: 特に、cx_popblock()
はもはや cxstack_ix
をデクリメントしなくなりました。 pp_leave*
関数内の cx_popblock()
, cx_popsub()
などに関する ステップの順番が変わりました。 これらの使い方に関する詳細については新しい文書である "Dynamic Scope and the Context Stack" in perlguts を参照してください。
一貫して CX_ 接頭辞を持つ、様々なマクロが追加されたり:
CX_CUR(), CX_LEAVE_SCOPE(), CX_POP()
リネームされたりしました:
CX_POP_SAVEARRAY(), CX_DEBUG(), CX_PUSHSUBST(), CX_POPSUBST()
cx_pushblock()
は PL_savestack_ix
と PL_tmps_floor
を 保存するようになったので、pp_enter*
と pp_leave*
はもはや以下のように しなくてもよくなりました:
ENTER; SAVETMPS; ....; LEAVE
cx_popblock()
は PL_curpm
も復元するようになりました。
全てのコンテキスト型の dounwind()
で、現在の savestack フレームは それぞれのコンテキストが pop する前に処理されるようになりました; 以前はこれは sub 風のコンテキストフレームでのみ行われていました。 この処理は cx_popsub()
から取り除かれて独自のマクロ CX_LEAVE_SCOPE(cx)
に 置かれました; これは cx_popsub()
などの前に呼び出さなければなりません。
dounwind()
は最後に pop したフレームで cx_popblock()
も 行うようになりました (以前は各フレームで cx_popsub()
などのアクションのみが 行われていました)。
temps スタックはスコープの終了時に解放されるようになりました; 以前は、ブロックの最後の文の中で作成された temps は、 (スカラコンテキストの再帰サブルーチンに対してこれを行う既存のハックは別として) そのブロックに引き続く次の nextstate
まで解放されませんでした; そして f(g())
のようなものの中では、g()
の最後の文で作られた temps は、以前は f()
からの return に引き続く分まで 解放されていませんでした。
スコープエントリの savestack に保存されるほとんどの値は、そのコンテキスト 構造体の適切な新しいフィールドに保存されるようになりました。 cx_pushfoo()
と cx_popfoo()
によって直接保存と復元が行われるようになり、 はるかに高速になりました。
様々なコンテキスト構造体フィールドが追加、削除、変更されました。
cx_pushsub()
と cx_popsub()
での @_
の扱いはかなり整理されました; コンテキスト構造体から argarray
フィールドが取り除かれたり、 一部の共通(しかしめったに使われない)コードが clear_defarray()
という 別関数に抽出されたりしました。 また、pp_goto
のようにその場で展開する cx_popsub()
の有用な一部分が 新しい関数 cx_popsub_args()
と cx_popsub_common()
にまとめられました。
pp_leavesub
と pp_leavesublv
は、返り値を処理するためにその他の pp_leave*
と同じ関数を使うようになりました。
CXp_FOR_PAD
と CXp_FOR_GV
フラグが追加され、CXt_LOOP_FOR
は CXt_LOOP_LIST
と CXt_LOOP_ARY
に分割されました。
以前 dMULTICALL
で宣言されていた (しかし文書化されていなかった) 変数が 取り除かれました。
事実上 Perl 1 の名残である、不明瞭な PL_timesbuf
変数は取り除かれました。 これは Perl 5.20 で廃止予定となり、5.21.x の早い段階で 取り除かれるとされていました; これがついに行われました。 [perl #121351]
Perl_newATTRSUB_x()
での保証されないアサートが取り除かれました。 プロトタイプ付きのスタブサブルーチン定義がある場合、属性を持つ同じ サブルーチンのスタブ(または定義)が引き続くと、ヌルポインタによるアサート失敗が 発生していました。 [perl #126845]
ExtUtils::ParseXS
で ::
は __
に置き換えるようになりました; これは引数/返り値に対してと同様に行われます。 これにより一貫性が増し、 また C++ クラスをネストした Perl 名前空間にラッピングする XS コードを書くのが 単純化されました (Foo_Bar
のためと Foo::Bar
のための二つではなく、 Foo__Bar
のための一つだけ typedef が必要になりました)。
to_utf8_case()
関数は廃止予定になりました。 代わりに toUPPER_utf8
, toTITLE_utf8
, toLOWER_utf8
, toFOLD_utf8
を 使ってください。 (http://nntp.perl.org/group/perl.perl5.porters/233287 を参照してください。)
Perl コードと threads エクステンションはアノテーションが付けられました; Perl がスレッドを使うように設定されていると、 コンパイル時に clang (3.6) 以降はミューテックスの疑わしい使用法について 警告を出していました。 さらなる情報については http://clang.llvm.org/docs/ThreadSafetyAnalysis.html を参照してください。
signbit()
エミュレーションが拡張されました。 これはより古い、あるいはより変わったプラットフォームや設定の助けになります。
コアにあるほとんどの EBCDIC 固有のコードは非 EBCDIC コードと統一化されました; 繰り返しを避けて保守をより容易にするためです。
$^X
のための MSWin32 コードは win32 ディレクトリから caretx.c に 移されました; 他のオペレーティングシステムもこの変数を設定します。
sv_ref()
は API の一部になりました。
"sv_backoff" in perlapi の返り型は int
から void
に変更されました。 これは以前は Perl 5.000 stable から常に 0
を返していましたが、 文書化されていませんでした。 sv_backoff
は公式 API としてマークされていましたが、XS コードに影響は ないと想定しています; 適切な API 呼び出しは公式 API sv_setsv(sv, &PL_sv_undef)
, または 疑似公式 API SvOOK_off
または非公式 API SvOK_off
を通していて、 以前は sv_backoff
の返り値は意味がない定数で、(sv_backoff(sv),0)
と 書き直せるものだったからです。
EXTEND
と MEXTEND
マクロは、整数の切り詰めとラッピングに関する様々な 問題を避けるために改良されました。 特に、以前マクロの中で使われていたいくつかのキャストが取り除かれました。 これにより、例えば、符号なしの nitems
引数を渡すとおそらくコンパイル警告が 発生するようになります(これは常に符号付き値を要求するように 文書化されています; 以前は int、最近は SSize_t でした)。
PL_sawalias
と GPf_ALIASED_SV
は取り除かれました。
GvASSIGN_GENERATION
と GvASSIGN_GENERATION_set
は取り除かれました。
以下のようにユーザー定義特性の場合で:
qr/\p{mypkg1::IsMyProperty}/i
/i
大文字小文字無視、明示的なパッケージ名指定があり、 IsMyProperty がパターンのコンパイル時に未定義でも正しく 動作するようになりました。
Perl の memcpy()
, memmove()
, memset()
, memcmp()
フォールバックは オリジナルとの互換性が向上しました。 [perl #127619]
Fixed the issue where a with -DPERL_NO_COW の時に s///r
) がソース SV を変更しようとして、 プログラムが死ぬ問題が修正されました。 [perl #127635]
パターンがマッチングに失敗するという EBCDIC プラットフォームのみでの 問題が修正されました。 これは、マッチングのターゲット文字列が UTF-8 で、マッチング文字が C1 制御文字の集合のときに起こっていました。
strict.pm と warnings.pm でのファイル名チェックが狭められました。 以前は、(.pmc? 拡張子抜きの) ファイル名がパッケージ名が違う場合、 スペルミスした use 文 (つまり use strict
のつもりで use Strict
と 書いた) と仮定していました。 今回、これが本当に大文字小文字を間違えたものかをチェックして、その他のものは チェックしなくなりました。
正規表現のパース時のアサート失敗がよりユーザーフレンドリーになりました。 [perl #127599]
文字クラスが終端していないけれども末尾に逆スラッシュがあるパターンを コンパイルしようとしたときに正しくエラーを発生させるようになりました。 [perl #126141]。
行番号が 2**31-1 よりも大きいけれども 2**32 よりも小さいとき、 caller()
は負数を返さなくなりました。 [perl #126991]
文法警告が有効のとき、unless (
assignment
)
は適切に 警告するようになりました。 [perl #127122]
ISA
グロブに配列リファレンスを設定したときに、全ての存在する要素に 適切に isaelem
magic が追加されるようになりました。 以前はこのような要素の変更は ISA キャッシュを更新していなかったので、 メソッド呼び出しで間違った関数を呼び出すことがありました。 また、ISA
グロブが壊されると perl がクラッシュしていました; 5.23.7 で追加された新しいコードが要素から isaelem
magic を 解放しようとするからです。 [perl #127351]
他の演算子のパース中にヒヤドキュメントが見つかり、パーサが既にファイルの 末尾まで読み込んでいて、ヒヤドキュメントが終端していないとき、perl は アサートしたりセグメンテーションフォルトしたりすることがありました。 終端していないヒヤドキュメントに関するエラーを確実に出力するようになりました。 [perl #125540]
untie()
は時々通常の値と同様 UNTIE()
ハンドラが返した最後の値を 返すことがあり、スタックを壊していました。 [perl #126621]
castflags & 2
が真のときの演算子の優先順位の問題が修正されました。 [perl #127474]
DESTROY メソッドをキャッシュすると、スタッシュの SvSTASH()
スロットに ポインタや STASH でないものが保管されることがあり、これにより B の STASH()
メソッドが壊れていました。 DESTROY メソッドはスタッシュのための MRO メタデータに キャッシュされるようになりました。 [perl #126410]
AUTOLOAD メソッドは DESTROY メソッドを探すときに呼び出されるようになり、 正しく $AUTOLOAD
を設定するようになりました。 [perl #124387] [perl #127494]
ファイル名なしの #line
指示子を処理するときにバッファの末尾を越えて パースしなくなりました。 [perl #127334]
正規表現パターンが qr/[[:alpha:]]/
のような POSIX クラスを含んでいるように 見えるけれども、その指定に問題があって通常の大かっこ文字クラスとして 扱われるような場合、Perl は警告を出すようになりました。 例の一つは、次のように 2 番目のコロンがない場合です: qr/[[:alpha]]/
. これは二つの文字の並びにマッチングするようにコンパイルされます。 二つ目は "]"
で、一つ目は "["
, ":"
, "a"
, "h"
, "l"
, "p"
のいずれかです。 これはおそらく意図した意味とは違うので、警告が発生するようになりました。 指定が 14 の正当な POSIX クラスととても近い場合以外は警告は発生しません。 ("POSIX Character Classes" in perlrecharclass を参照してください。) [perl #8904]
否定の大かっこ文字クラスの中に反転 POSIX クラスがあり、何か他にオプションで マッチングするような特定の正規表現パターンは、 間違ってマッチングに失敗することがありました。 失敗を引き起こすものの例は qr/_?[^\Wbar]\x{100}/
です。 これは修正されました。 [perl #127537]
Perl 5.22 では C99 の 16 進浮動小数点記法対応が追加されましたが、時々 16 進小数を間違ってパースしていました。 これは修正されました。 [perl #127183]
strict が指定されているにも関わらずハッシュキーとして未定義の裸の単語が 許されるという退行が修正されました。 [perl #126981]
import()
や unimport()
メソッドが見つからないときに内部で使われる &PL_sv_yes
プレースホルダの呼び出しは、正しくスカラコンテキストを 扱えるようになりました。 [perl #126042]
演算子が想定される場所に配列があったときにより多くの情報を報告し、 アサート失敗を避けるようになりました。 [perl #123737]
以前パッケージ @ISA
だった配列を変更しても、アサート失敗やクラッシュを 引き起こさなくなりました。 [perl #123788]
通常と DEBUGGING perl ビルドのバイナリ互換性を維持するようになりました。 [perl #127212]
darwin で $ENV{foo}
を設定するときのメモリリークを修正しました。 [perl #126240]
/...\G/
は utf8 文字列でクラッシュしなくなりました。 \G
が正規表現の先頭からの固定長の文字列の場合、perl は現在の pos()
の 位置から何文字戻るかをカウントして、そこからマッチングを開始する必要が あります。 しかし、この戻りカウントは文字でなくバイトで行われていたので、 utf8 文字列では panic を引き起こしていました。
整数を返す演算子が負の整数を大きな正の整数として返す場合がありました。 [perl #126635]
pipe()
演算子は DEBUGGING
ビルドのとき、正しいエラーメッセージを 出力せずにアサートを起こすことがありました。 アサートされる条件はアサートなしで正しく検出および報告されるので、 アサートは削除されました。 [perl #126480]
場合によっては、ヒヤドキュメントのパースの失敗時に解放されたメモリを 使おうとすることがありました。 これはポインタが正しく復元されないために起きていました。 [perl #126443]
@x = sort { *a = 0; $a <=> $b } 0 .. 1
としても *a の SV スロットを 復元する前に GP を解放しなくなりました。 [perl #124097]
新しい 16 進浮動小数点 printf フォーマット %a
に関する複数の問題が 修正されました: [perl #126582], [perl #126586], [perl #126822]
leave_scope()
で mg_set()
を呼び出してもリークしなくなりました。
正規表現コンパイルのデバッグ出力が間違っているという Perl v5.20 からの 退行が修正されました。 (パターンは正しくコンパイルされていましたが、表示されているものが 間違っていました。)
\b{sb}
はより良く動作するようになりました。 Perl v5.22.0 では、新しい構文は想定通りの結果を出力しないように見えましたが、 それでも Unicode による広範囲なテスト全てを通過していました。 これらは短い入力文字列で、長い文字列では失敗することが分かりました。
"Extended Bracketed Character Classes" in perlrecharclass でのある種の 文法エラーで、適切なエラーメッセージが表示されずに panic していました。 これは修正されました。 [perl #126481]
Perl 5.20 では正規表現の量指定子が無意味なときのメッセージを追加しましたが、 それによってパーサがそれを飛ばすようになりました; これにより、過剰な 量指定子が、エラーにならずに暗黙に無視されていました。 これは修正されました。 [perl #126253]
win32/makefile.mk での、非 XS モジュールを最後にビルドする変更 (平行ビルドを 有効にするための変更の一部として意図的に導入されたもの) によって、 version モジュールの問題によって POSIX のビルドが壊れていました。 これは修正されました。
16 進浮動小数定数のパースが改良されました。
pack "H"
(および pack "h"
) が、非 utf8 のソースと utf8 の ターゲットを与えられたとき、ソースの先頭より前を読むことがあるという pack()
の問題が修正されました。 [perl #126325]
セグメンテーションフォルトや C レベルのアサートで perl が異常終了する いくつかのケースが修正されました。 [perl #126615], [perl #126602], [perl #126193].
正規表現パターン中に、コメント ((?#...)
) が書けるべきところで 書けなくなっていました。 これは修正されました。 [perl #116639]
正規表現中の (?[...])
構文に 文法エラーがあると、適切なエラーメッセージが表示されずに セグメンテーションフォルトを引き起こすという、Perl 5.20 からの退行が 修正されました。 [perl #126180] [perl #126404]
\c]
のようなものが panic を引き起こすという、 (?[...])
構文の もう一つの問題が修正されました。 [perl #126181]
perl スタックを 2G 近辺や 4G 近辺に拡張しようとするときの問題が 修正されました。 これは特に 32 ビットでビルドされた perl が 64 ビット整数を使うときに 問題となり、次のようなリスト繰り返し演算子で簡単に気付くことができました:
@a = (1) x $big_number
以前は、perl は $big_number
の正確な値によっては クラッシュすることがありました; これは典型的には例外を発生させるようになりました。 [perl #125937]
条件正規表現 (?(condition)yes-pattern|no-pattern)
で、 条件が (?!)
の場合、パターンなしにマッチングするのではなく、まったく マッチングしなくなっていました。 これは修正されました。 [perl #126222]
特殊バックトラック制御動詞 (*VERB:ARG)
は引数が全てオプションとなり、 REGERROR
/REGMARK
を適切に設定するようになりました。 [perl #126186]
(Perl 5.22 で導入された) 境界チェック構文 \b{gcb}
, \b{sb}
, \b{wb}
, \B{gcb}
, \B{sb}
, \B{wb}
での、セグメンテーションフォルトを含む いくつかのバグが修正されました。 全ての \B{}
で空文字列がマッチングするようになり、全ての \b{}
で 空文字列がマッチングしないようになりました。 [perl #126319]
書き込み用の閉じたファイルハンドルを複製しても、もはや GLOB(0xXXXXXXXX) の形のファイル名を作らなくなりました。 [perl #125115]
警告の致命的エラー化は、スタックを巻き戻すときには無視されるようになりました。 これにより、致命的エラーがスタックを巻き戻すときの無限ループを防ぎます。 [perl #123398]
Perl 5.22.0 では、-C オプションへの数値引数をパースするときのロジックが 変更され、正しくパース出来た数値が引数の末尾としてパースされた場合、その値が オプションの値として保存されていませんでした。 [perl #125381]
PadlistNAMES マクロは再び左辺値になりました。
サブスレッドのために -DPERL_TRACE_OPS メモリを Zero 初期化するようになりました。
perl_clone_using()
は PL_op_exec_cnt[] の Zero 初期化が抜けていました。 これにより、スレッド化 -DPERL_TRACE_OPS ビルドのサブスレッドが大きすぎる op-counts を破壊時に出力していました。 これらのカウントは print %x すると "ABABABAB" という明らかに汚染されている 値が表示されます。
perl 5.000 から、XS typemap でリークがありました; FILE *
や PerlIO *
が OUTPUT:
されるか Perl にインポートされる度に一つのスカラが リークしていました。 これらの特定の typemap エントリは XS モジュールで使われるのは極めて稀だと 考えられます。 [perl #124181]
alarm()
と sleep()
は、引数が負数で undef を返す場合に警告を 出すようになりました。 以前はこれらは負の値を基礎となる C 関数に渡していて、驚くべき値でタイマーを 設定することがありました。
Perl は再び全ての Unicode のバージョンでコンパイルできるようになりました。 これは(ほとんど)動作していましたが、v5.18 から v5.20 まで 動作していませんでした。 Name_Alias
特性は Unicode 5.0 以前には存在していませんでした。 Unicode::UCD では間違ってこれがあるとしていました。 これは修正されました。
正規表現中の(Unicode を越える)とても大きい符号位置は、UTF-8 に変換するときに ときどきバッファオーバーフローを起こしていましたが、起こさなくなりました。 [perl #125826]
リストコンテキストの範囲演算子 (...) での整数オーバーフローチェックは、 範囲のサイズがアドレス空間よりも大きい場合を正しく扱えるようになりました。 これは 32 ビットでの -Duse64bitint で起こることがありました。 [perl #125781]
%::=(); J->${\"::"}
でのクラッシュは修正されました。 [perl #125541]
qr/(?[ () ])/
はもはやセグメンテーションフォルトを起こさず、代わりに 文法エラーを出すようになりました。 [perl #125805]
正規表現所有量指定子の Perl 5.20 での退行は修正されました。 qr/
PAT{
min,max}+
/
は qr/(?>
PAT{
min,max})/
と同じように振る舞うことが 想定されていました。 Perl 5.20 から、min と max が同じ場合は動作していませんでした。 [perl #125825]
BEGIN <>
はもはやセグメンテーションフォルトを起こさず、適切に エラーメッセージを出力するようになりました。 [perl #125341]
tr///
で、tr/\x{101}-\x{100}//
のような不正な後方範囲が 検出できないことがあり、間違った結果になることがありました。 これは修正されました。
コンテキストスタックの再作業 によって一部のモジュールが 壊れています。 これらのモジュールは perl の中の保証されていない実装詳細に依存していました。 メンテナには連絡されていて、必要なら perl5-porters に連絡しています。 以下はこれらのモジュールの一部です:
Coro と perl v5.22.0 は perl の変更によって既に非互換でした; perl コンテキストスタックの再作業によってさらに非互換になりました。 perl5-porters は メーリングリストでこの問題について議論しています .
lexical::underscore モジュールはもはや perl v5.24.0 で動作しなくなりました; なぜならもはや perl はレキシカルな $_
を持たないからです!
mod_perl
は v5.22.0 以降のためにパッチが当てられましたが、リリースは されていません。 関連するパッチ (およびその他の変更) は GitHub にミラーされている. ソースコードレポジトリにあります。
Perl 5.24.0 は、Perl 5.22.0 以降、77 人の作者によって、 1,800 のファイルに約 360,000 行の変更を加えて、 約 11 ヶ月開発されてきました。
自動生成ファイル、文書、リリースツールを除くと、1,200 の .pm, .t, .c, .h ファイルに約 250,000 行の変更を加えました。
Perl は、活気のあるユーザーと開発者のコミュニティのおかげで 20 年を超えて 繁栄しています。 以下の人々が、Perl 5.24.0 になるための改良に貢献したことが分かっています:
Aaron Crane, Aaron Priven, Abigail, Achim Gratz, Alexander D'Archangel, Alex Vandiver, Andreas König, Andy Broad, Andy Dougherty, Aristotle Pagaltzis, Chase Whitener, Chas. Owens, Chris 'BinGOs' Williams, Craig A. Berry, Dagfinn Ilmari Mannsåker, Dan Collins, Daniel Dragan, David Golden, David Mitchell, Dominic Hargreaves, Doug Bell, Dr.Ruud, Ed Avis, Ed J, Father Chrysostomos, Herbert Breunung, H.Merijn Brand, Hugo van der Sanden, Ivan Pozdeev, James E Keenan, Jan Dubois, Jarkko Hietaniemi, Jerry D. Hedden, Jim Cromie, John Peacock, John SJ Anderson, Karen Etheridge, Karl Williamson, kmx, Leon Timmermans, Ludovic E. R. Tolhurst-Cleaver, Lukas Mai, Martijn Lievaart, Matthew Horsfall, Mattia Barbon, Max Maischein, Mohammed El-Afifi, Nicholas Clark, Nicolas R., Niko Tyni, Peter John Acklam, Peter Martini, Peter Rabbitson, Pip Cet, Rafael Garcia-Suarez, Reini Urban, Renee Baecker, Ricardo Signes, Sawyer X, Shlomi Fish, Sisyphus, Stanislaw Pusep, Steffen Müller, Stevan Little, Steve Hay, Sullivan Beck, Thomas Sibley, Todd Rinaldo, Tom Hukins, Tony Cook, Unicode Consortium, Victor Adam, Vincent Pit, Vladimir Timofeev, Yves Orton, Zachary Storer, Zefram.
これはバージョンコントロール履歴から自動的に生成しているので、ほぼ確実に 不完全です。 特に、Perl バグトラッカーに問題を報告をしてくれた (とてもありがたい)貢献者の 名前を含んでいません。
このバージョンに含まれている変更の多くは、Perl コアに含まれている CPAN モジュール由来のものです。 私たちは Perl の発展を助けている CPAN コミュニティ全体に感謝します。
全ての Perl の歴史的な貢献者のより完全な一覧については、どうか Perl ソース 配布に含まれている AUTHORS を参照してください。
もしバグと思われるものを見つけたら、comp.lang.perl.misc ニュースグループに 最近投稿された記事や https://rt.perl.org/ にある perl バグ データベースを確認してください。 Perl ホームページ、http://www.perl.org/ にも情報があります。
もしまだ報告されていないバグだと確信したら、そのリリースに含まれている perlbug プログラムを実行してください。 バグの再現スクリプトを十分小さく、しかし有効なコードに切りつめることを 意識してください。 バグレポートは perl -V
の出力と一緒に perlbug@perl.org に送られ Perl porting チームによって解析されます。
報告しようとしているバグがセキュリティに関するもので、公開されている メーリングリストに送るのが不適切なものなら、バグの報告方法の詳細について "SECURITY VULNERABILITY CONTACT INFORMATION" in perlsec を参照してください。
変更点の完全な詳細を見る方法については Changes ファイル。
Perl のビルド方法については INSTALL ファイル。
一般的なことについては README ファイル。
著作権情報については Artistic 及び Copying ファイル。