Identifier_Status
と Identifier_Type
に対応qr/\p{Name=...}/
や qr!\p{na=/(SMILING|GRINNING) FACE/}!
と書けるようになりましたPOSIX::mblen()
, mbtowc
, wctomb
の改良POSIX::mbstowcs
と POSIX::wcstombs
は削除されました(?[...])
のバグ修正により、一部のパターンはもはやコンパイル出来なくなったかもしれません\p{user-defined}
特性は常に公的な Unicode のものを上書きするようになりましたvec
の使用は禁止されましたSys::Hostname::hostname()
は引数を許さなくなりました\K
は先読みと後読みの言明では許されなくなりましたperl5320delta - perl v5.32.0 での変更点
この文書は 5.30.0 リリースと 5.32.0 リリースの変更点を記述しています。
5.28.0 のような以前のリリースから更新する場合は、まず 5.28.0 と 5.30.0 の違いについて記述している perl5300delta を読んでください。
isa
という名前の新しい実験的な二項演算子は、 与えられたオブジェクトが指定されたクラスまたはその派生クラスの インスタンスかどうかをテストします:
if( $obj isa Package::Name ) { ... }
さらなる詳細については "Class Instance Operator" in perlop を参照してください。
詳しくは https://www.unicode.org/versions/Unicode13.0.0/ を 参照してください。
一部の比較演算子は、その結合性により、同じ優先順位を持ついくつかの 演算子と 連鎖 します (しかし異なった優先順位を持つ演算子と 連鎖することはありません)。
if ( $x < $y <= $z ) {...}
これは正確に次のように振る舞います:
if ( $x < $y && $y <= $z ) {...}
("$y"
は見た目通りに単純なスカラと仮定します。)
perlop の "Operator Precedence and Associativity" in perlop で これについてさらに読むことができます。
Identifier_Status
と Identifier_Type
に対応Unicode は正規表現要件の見直し作業中です: https://www.unicode.org/draft/reports/tr18/tr18.html。 この一環として、厳密な UCD (Unicode character database) の一部ではない、 より多くの特性を露出させるように求めています。 これら二つはセキュリティ上の理由で入力を検査するために使われています。 これらの使用法の詳細は https://www.unicode.org/reports/tr39/proposed.html にあります。
qr/\p{Name=...}/
や qr!\p{na=/(SMILING|GRINNING) FACE/}!
と書けるようになりました\N{...}
の代替策として、Unicode Name 特性が正規表現パターン中で アクセス可能になりました。 二つの手法の比較は "Comparison of \N{...} and \p{name=...}" in perlunicode にあります。
前述の 2 番目の例は、この特性でワイルドカード部分パターンも使えることを 示しています。 "Wildcards in Property Values" in perlunicode を参照してください。
POSIX::mblen()
, mbtowc
, wctomb
の改良POSIX::mblen()
, mbtowc
, wctomb
関数は、 状態遷移ロケールで動作するようになり、 ロケールがスレッドセーフなプログラムで実行されるとき、 C99 以上のコンパイラではスレッドセーフになりました; 長さの引数はオプションになりました。
これらの関数は常に現在の C 言語のロケールの基で実行されます。 (perllocale を参照してください。) ほとんどのロケールはステートレスですが、いくつかのロケール、 特にとても稀に遭遇する ISO 2022 は、これらの関数の呼び出し間で 状態を維持します。 以前はこの状態は呼び出し毎にクリアされていましたが、 指定された引数が undef
でない限り、この状態はリセットされなくなりました。
スレッド対応 perl で、C99 関数 mbrlen(3), mbrtowc(3), wcrtomb(3) が利用可能なら、通常の関数を置き換えます。 これにより、ロケールがスレッドセーフなプラットフォームで実行されたとき、 これらの関数もスレッドセーフになります。
mblen
と mbtowc
での文字列の長さの引数はオプションになりました; ソース文字列をパースする長さを実際の長さよりも短く制限したい場合にのみ 有用です。
"(*pla:pattern)" in perlre, "(*plb:pattern)" in perlre, "(*nla:pattern)" in perlre>, "(*nlb:pattern)" in perlre を参照してください。 これらの使用はもはや警告を出力しません; 警告カテゴリ experimental::alpha_assertions
を無効にする既存のコードは 何の変更の必要もなく動き続けます。 このカテゴリを有効にしても何も起きません。
"Script Runs" in perlre を参照してください。 これらの使用はもはや警告を出力しません; 警告カテゴリ experimental::script_run
を無効にする既存のコードは 何の変更の必要もなく動き続けます。 このカテゴリを有効にしても何も起きません。
以前は、機能が機能の束の外側で設定されていた場合、パーサでの機能チェックは ハッシュの検索が必要でした。 これは、ビットマスクチェックに最適化されました。 [GH #17229]
Perl は GitHub で開発されるようになりました。 https://github.com/Perl/perl5 で見られます。
非セキュリティバグは GitHub 経由で報告してください。 セキュリティ問題は引き続き perlsec に書かれている方法で報告してください。
これは主に正規表現コンパイラの中のバグを見つけ出すのに有用です。 このダンプは -DDEBUGGING
perl でコマンドラインに -Drv
を指定するか; パターンが use re qw(Debug DUMP_PRE_OPTIMIZE)
または use re qw(Debug COMPILE EXTRA)
のスコープの下でコンパイルされた場合は 全ての perl で発生します (2 番目以外の全ての場合は他の情報も表示されます。)
ネストした正規表現量指定子の保管スペースの計算での 符号付き size_t
整数オーバーフローを引き起こすことがあります; これにより Perl の正規表現コンパイラが、 攻撃者が提供したデータの正規表現保管スペースの後ろに割り当てられた メモリを上書きするという、 ヒープバッファオーバーフローを引き起こすことがあります。
ターゲットシステムは、オーバーフローが起きる前に、ネストした量指定子の 部分的な十分な量のメモリが必要です。 この要求を 64 ビットシステムで満たすことはおそらくできないでしょう。
ManhND of The Tarantula Team, VinCSS (Vingroup のメンバー) によって 発見されました。
正規表現エンジンの命令の間でのオフセットの整数オーバーフローにより、 コンパイルされた正規表現の中間言語状態が破壊されることがあります。 攻撃者はこの振る舞いを、Perl 正規表現のコンパイルされた形式に命令を 挿入することに悪用できます。
Hugo van der Sanden と Slaven Rezic によって発見されました。
正規表現の中間言語表現を最適化するために、 Perl の正規表現コンパイラが S_study_chunk()
を再帰呼び出しすることで、 コンパイルされた正規表現の中間言語状態が破壊されることがあります。
Sergey Aleynikov によって発見されました。
Perl で書かれたアプリケーションは、攻撃者によって提供された正規表現を 評価している場合にのみ、前述の不具合に対して脆弱です。 このような方法で正規表現を評価することは、危険であることが知られています; 正規表現エンジンはこのような使用シナリオでのサービス不能攻撃から 守られていないからです。
これらのほんの一部の機能は、不適切か、この作業を達成するのに 使われるアルゴリズムを妨害します。 完全なリストは "Wildcards in Property Values" in perlunicode にあります。
POSIX::mbstowcs
と POSIX::wcstombs
は削除されましたこれらの関数は、欠陥のあるインターフェース定義のために全く 動作していませんでした。 この関数が利用可能であると主張してから何年間も誰も苦情を言わなかったので、 明らかにこれらの需要はありません; 従ってこれらに対する「対応」は 削除されました。
(?[...])
のバグ修正により、一部のパターンはもはやコンパイル出来なくなったかもしれません"Selected Bug Fixes" を参照してください。 以前使われていた経験則では、エラーになるべき一部の構文が (おそらくプログラマの意図しない効果として)コンパイル出来ていたかもしれません。 現在知られているものはありませんが、一部の誤った構文がもはや コンパイル出来なくなった可能性があります。
\p{user-defined}
特性は常に公的な Unicode のものを上書きするようになりました以前は、ユーザー定義特性がそれを含む正規表現パターンのコンパイルより 前に宣言された場合にのみ、 その定義は、同じ名前の公式 Unicode 特性の代わりに使われていました。 これは、常に公式特性を上書きするようになりました。 この変更は、以前の振る舞いに(おそらくうっかり)依存していた既存のコードを 壊すかもしれません。 この修正なしでは、もし Unicode が、たまたまあなたが長い間使っていたのと 同じ名前の新しい特性を持つ新しいバージョンをリリースすると、 あなたのプログラムは、その新しい Unicode バージョンを使う perl に アップグレードしたときに、壊れることになります。 "User-Defined Character Properties" in perlunicode を参照してください。 [GH #17205]
次のようなコードで:
my $var;
$sub = sub () { $var };
$var
が何らかの変更可能な内容へのリファレンスの場合、 サブルーチンが定義されたときに例外を出力するようになりました。
このエラーは、関数定義に return を追加することで避けられます:
$sub = sub () { return $var };
これは Perl 5.22 から廃止予定でした。 [perl #134138]
vec
の使用は禁止されましたこのような文字列は内部では UTF-8 で表現されていて、 vec
はビット指向演算なので、おそらくこれらの文字列に対しては 想定外の結果になります。 これは perl 5.28.0 で廃止予定になっていました。
これらの使用法の一部は既に以前の廃止予定サイクルで不正なものになっていました。 perl 5.28.0 で廃止予定になっていた、残りの使用法も禁止されました。 perldeprecation を参照してください。
Sys::Hostname::hostname()
は引数を許さなくなりましたこの使用法は perl 5.28.0 から廃止予定でしたが、致命的エラーになりました。
以前は、範囲 "0" .. "-1"
は "0" から "99" までの数値文字列の範囲を 生成していました; これは 0 .. -1
と同様に空リストを 生成するようになりました。 また、"0" .. "9"
は以前は文字列のリストを生成していましたが、 整数のリストを生成するようになりました。
これは、先頭が "0" で始まる文字列を文字列として扱う特殊ケースのためで、 "00" .. "03"
のような範囲は "00", "01", "02", "03"
を生成しますが、 文字列 "0"
は特に扱っていませんでした。 [perl #133695]
\K
は先読みと後読みの言明では許されなくなりましたこれは、想定外の振る舞いを引き起こし、望まれる振る舞いがどうあるべきか 誰も定義できなかったので、許されなくなりました。 [perl #124256]
my_strnlen
は、自身の strnlen
実装を持たないシステムで 高速化されました。
grok_bin_oct_hex
(および grok_bin
, grok_oct
, grok_hex
) は 高速化されました。
grok_number_flags
は高速化されました。
sort
は、sort {$a <=> $b}
や sort {$b <=> $a}
のような場合に 著しく速くなりました。 [GH #17608]
Archive::Tar はバージョン 2.32 から 2.36 に更新されました。
autodie はバージョン 2.29 から 2.32 に更新されました。
B はバージョン 1.76 から 1.80 に更新されました。
B::Deparse はバージョン 1.49 から 1.54 に更新されました。
Benchmark はバージョン 1.22 から 1.23 に更新されました。
charnames はバージョン 1.45 から 1.48 に更新されました。
Class::Struct はバージョン 0.65 から 0.66 に更新されました。
Compress::Raw::Bzip2 はバージョン 2.084 から 2.093 に更新されました。
Compress::Raw::Zlib はバージョン 2.084 から 2.093 に更新されました。
CPAN はバージョン 2.22 から 2.27 に更新されました。
DB_File はバージョン 1.843 から 1.853 に更新されました。
Devel::PPPort はバージョン 3.52 から 3.57 に更新されました。
Win32 で生成されたテストファイルは、 POSIX 風システムで作成されたものと同じになりました。
diagnostics はバージョン 1.36 から 1.37 に更新されました。
Digest::MD5 はバージョン 2.55 から 2.55_01 に更新されました。
Dumpvalue はバージョン 1.18 から 1.21 に更新されました。
以前は、配列の要素をダンプ中に未定義値に遭遇すると、 表示される文字列は empty array
でした。 これは、おそらく最初に意図していたものに変更されました: empty slot
。
DynaLoader はバージョン 1.45 から 1.47 に更新されました。
Encode はバージョン 3.01 から 3.06 に更新されました。
encoding はバージョン 2.22 から 3.00 に更新されました。
English はバージョン 1.10 から 1.11 に更新されました。
Exporter はバージョン 5.73 から 5.74 に更新されました。
ExtUtils::CBuilder はバージョン 0.280231 から 0.280234 に更新されました。
ExtUtils::MakeMaker はバージョン 7.34 から 7.44 に更新されました。
feature はバージョン 1.54 から 1.58 に更新されました。
新しい indirect
機能が追加されました; これはデフォルトでは有効ですが、 間接オブジェクト文法 をオフに出来ます。
File::Find はバージョン 1.36 から 1.37 に更新されました。
Win32 では、ファイルがドライブのルートディレクトリか書き込み可能な ルートディレクトリであることのテストはもはや要求されなくなりました。
File::Glob はバージョン 1.32 から 1.33 に更新されました。
File::stat はバージョン 1.08 から 1.09 に更新されました。
Filter::Simple はバージョン 0.95 から 0.96 に更新されました。
Getopt::Long はバージョン 2.5 から 2.51 に更新されました。
Hash::Util はバージョン 0.22 から 0.23 に更新されました。
例のコードが新しい perl で動作しなくなっていたので、概要が更新されました。 [GH #17399]
I18N::Langinfo はバージョン 0.18 から 0.19 に更新されました。
I18N::LangTags はバージョン 0.43 から 0.44 に更新されました。
IGNORE_WIN32_LOCALE
環境変数が文書化されました。
IO はバージョン 1.40 から 1.43 に更新されました。
IO::Socket はもはやプロトコルの値の 0 をキャッシュしなくなりました; なぜならこれは実装がプロトコルを選ぶことを示しているからです。 つまり、与えられたソケット型に対して SO_PROTOCOL
が実装されていない プラットフォームでは、protocol メソッドは undef
を 返すかもしれないということです。
指定された TO は常に send()
メソッドで効果を持つようになりました。 [perl #133936]
IO-Compress はバージョン 2.084 から 2.093 に更新されました。
IPC::Cmd はバージョン 1.02 から 1.04 に更新されました。
IPC::Open3 はバージョン 1.20 から 1.21 に更新されました。
JSON::PP はバージョン 4.02 から 4.04 に更新されました。
Math::BigInt はバージョン 1.999816 から 1.999818 に更新されました。
Math::BigInt::FastCalc はバージョン 0.5008 から 0.5009 に更新されました。
Module::CoreList はバージョン 5.20190522 から 5.20200620 に更新されました。
Module::Load::Conditional はバージョン 0.68 から 0.70 に更新されました。
Module::Metadata はバージョン 1.000036 から 1.000037 に更新されました。
mro はバージョン 1.22 から 1.23 に更新されました。
Net::Ping はバージョン 2.71 から 2.72 に更新されました。
Opcode はバージョン 1.43 から 1.47 に更新されました。
open はバージョン 1.11 から 1.12 に更新されました。
overload はバージョン 1.30 から 1.31 に更新されました。
parent はバージョン 0.237 から 0.238 に更新されました。
perlfaq はバージョン 5.20190126 から 5.20200523 に更新されました。
PerlIO はバージョン 1.10 から 1.11 に更新されました。
PerlIO::encoding はバージョン 0.27 から 0.28 に更新されました。
PerlIO::via はバージョン 0.17 から 0.18 に更新されました。
Pod::Html はバージョン 1.24 から 1.25 に更新されました。
Pod::Simple はバージョン 3.35 から 3.40 に更新されました。
podlators はバージョン 4.11 から 4.14 に更新されました。
POSIX はバージョン 1.88 から 1.94 に更新されました。
re はバージョン 0.37 から 0.40 に更新されました。
Safe はバージョン 2.40 から 2.41 に更新されました。
Scalar::Util はバージョン 1.50 から 1.55 に更新されました。
SelfLoader はバージョン 1.25 から 1.26 に更新されました。
Socket はバージョン 2.027 から 2.029 に更新されました。
Storable はバージョン 3.15 から 3.21 に更新されました。
Test::More からの note()
の使用はテストでオプションになりました。 これは、CPAN からとても古い perl にインストールしたときの Test::More の 循環参照を回避します。
2GB を超える Vstring マジック文字列は許されなくなりました。
正規表現オブジェクトは取得の目的のためのオブジェクト ID が適切に カウントされていませんでした。 これは結果の構造体を壊したり、場合によっては実行時エラーを 引き起こすことがありました。 [perl #134179]
Sys::Hostname はバージョン 1.22 から 1.23 に更新されました。
Sys::Syslog はバージョン 0.35 から 0.36 に更新されました。
Term::ANSIColor はバージョン 4.06 から 5.01 に更新されました。
Test::Simple はバージョン 1.302162 から 1.302175 に更新されました。
Thread はバージョン 3.04 から 3.05 に更新されました。
Thread::Queue はバージョン 3.13 から 3.14 に更新されました。
threads はバージョン 2.22 から 2.25 に更新されました。
threads::shared はバージョン 1.60 から 1.61 に更新されました。
Tie::File はバージョン 1.02 から 1.06 に更新されました。
Tie::Hash::NamedCapture はバージョン 0.10 から 0.13 に更新されました。
Tie::Scalar はバージョン 1.04 から 1.05 に更新されました。
Tie::StdHandle はバージョン 4.5 から 4.6 に更新されました。
Time::HiRes はバージョン 1.9760 から 1.9764 に更新されました。
5.6 より前の perl やクラシック MacOS の対応のためのような古いコードが 削除されました。 [perl #134288]
Time::Piece はバージョン 1.33 から 1.3401 に更新されました。
Unicode::Normalize はバージョン 1.26 から 1.27 に更新されました。
Unicode::UCD はバージョン 0.72 から 0.75 に更新されました。
VMS::Stdio はバージョン 2.44 から 2.45 に更新されました。
warnings はバージョン 1.44 から 1.47 に更新されました。
Win32 はバージョン 0.52 から 0.53 に更新されました。
Win32API::File はバージョン 0.1203 から 0.1203_01 に更新されました。
XS::APItest はバージョン 1.00 から 1.09 に更新されました。
Pod::Parser はコア配布から削除されました。 これは依然として CPAN からダウンロードすることで利用可能です。 これは [perl #119439] を解決します。
私たちはこの文書で挙げられた変更を反映するように文書を更新しようとしています。 もし抜けている物を発見したら、 https://github.com/Perl/perl5/issues でイシューを開いてください。
それに加えて、以下のような変更が行われました。
いくつかの regnode 定義の単純化
BOUND
と NBOUND
の定義の更新
ANYOFHs regnode の追加
このノードは ANYOFHb
と同様ですが、全てのマッチングした符号位置について 先頭の 2 バイト以上が等しい場合に使われます。
ANYOFHb
は、何かマッチングしないものに対して UTF-8 から符号位置に 変換する必要性を避けるために使われます。 これは、UTF-8 エンコードされたターゲットの最初のバイトが 求められているものかをチェックすることで、可能性のある符号位置の ほとんどを除外します。
sv_2pvbyte
は、SV が降格できないときに croak することについて 言及するように更新されました。
sv_setpvn
は、UTF-8 フラグはこの関数によって変更されないこと、 および末尾の NUL が保証されていることについて言及するように更新されました。
PL_phase
の文書が追加されました。
grok_bin
, grok_oct
, grok_hex
の文書が更新および明確化されました。
実験的な 'isa' 演算子の文書の追加
(S experimental::isa) この警告は、(isa
) 演算子を使うと発生します。 この演算子は現在のところ実験的であり、振る舞いは将来のリリースの Perl で 変更されるかもしれません。
caller
__FILE__
や __LINE__
と同様、 ここに返されたファイル名と行番号は "Plain Old Comments (Not!)" in perlsyn で記述された機構によって 置き換えることができます。
__FILE__
これは "Plain Old Comments (Not!)" in perlsyn で記述された機構によって 置き換えることができます。
__LINE__
これは "Plain Old Comments (Not!)" in perlsyn で記述された機構によって 置き換えることができます。
return
do BLOCK
から帰れないことに言及しました。
open
open()
の節は大きく刷新されました。
もはや perl の malloc
を使うことを提案しなくなりました。 今ではモダンなシステムの malloc
は perl の実装より遙かに良いものであると 仮定されます。
embed.fnc フラグに関する文書が削除されました。 embed.fnc は十分なコメントを内部に持つようになりました。 このファイルを変更しようとする人は最初にコレラのコメントを見ることになるので、 ここでの項目は冗長になりました。
UTF8f
の文書の更新
不足していた =for apidoc
行の追加
Perl の文字列と C の文字列との違いを詳しく述べるようになりました。
繰り返し演算子 x
の文書が明確化されました。 [GH #17335]
open
とハンドル使用法周りの文書は、3 引数 open および、 裸の単語ではなくレキシカル変数を使うように近代化されました。
全ての例を strict 安全にして、-w
を use warnings
に置き換えることを 含む様々な更新と修正。
'isa' 演算子は実験的
これは実験的機能で、use feature 'isa'
で有効化されたときに 利用可能です。 これは experimental::isa
カテゴリの警告を出力します。
perl インタプリタ内部の様々なスタックの詳細はここで 説明されるようになりました。
Z<>
の使用法に関する助言が追加されました。
年のフォーマットとして 70 ではなく正しい 1970 を使うように timegm
の例が更新されました。 [GH #16431]
いくつかのタイプミスの修正。
$]
を文字列化して数値として比較することを勧めるようになりました。
以前はなかったいくつかの関数の文書が追加されました。
単純なライブラリバインディングには libffi
を使うように 勧めるようになりました。
スレッド対応ビルドに関する setlocale
の警告は、 Perl 5.28.X 以降には適用されないことに触れるように更新されました。
Posix::SigSet->new(...)
は、 指定されたシグナルのどれも集合に追加できない場合はエラーが 投げられることを示すために更新されました。
それに加えて、以下のような変更が行われました。
今はなき https://search.cpan.org サイトへのリンクは、 等価な https://metacpan.org URL を指すようになりました。 [GH #17393]
ExtUtils::XSSymSet の man ページは、このモジュールがインストールされる 唯一のプラットフォームである VMS でのみインストールされるようになりました。 [GH #17424]
URL は https://
に変更され、古いリンクは更新されました。
適切な場所では、文書中の URL は http://
プロトコルから https://
に 変更されました。 これはまたバグトラッカーの場所 https://rt.perl.org にも影響を与えます。
OS/2 ライブラリ、Address Sanitizer およびその他のシステムツールへのリンクの 一部は古いものでした。 これらは動作するリンクに更新されました。
perl5-porters の古い E メールアドレスへのリンクの一部は古いものでした。 これらは動作するリンクに更新されました。
次のような追加と変更が、警告や致命的エラーメッセージを含む診断出力に 行われました。 診断メッセージの完全な一覧については、perldiag を参照してください。
Expecting interpolated extended charclass in regex; marked by <-- HERE in m/%s/
これは、"Changes to Existing Diagnostics" に挙げられているいくつかの エラーメッセージの置き換えです。
No digits found for %s literal
(F) 0x
に引き続いて 16 進数がないか、0b
に引き続いて 2 進数がありません。
Code point 0x%X is not Unicode, and not portable
これは実際には新しいメッセージではありませんが、 portable
が有効なときに出力されるようになりました。
正規表現中のコンパイル中に発生したとき、この警告はパターンのどの位置で 発生したかを示すマークを末尾に追加した文章を出力します。
Non-hex character '%c' terminates \x early. Resolved as "%s"
これは、より具体性がなく、間違った情報を与えていた警告を置き換えます。 この新しい警告は、\o{}
に関して既に存在している同様の警告に 並ぶものです。
Character following "\c" must be printable ASCII
これは正規表現中のコンパイル中に発生したとき、パターンのどの位置で 発生したかを示すマークを末尾に追加した文章を出力するようになりました。
これは正規表現中のコンパイル中に発生したとき、パターンのどの位置で 発生したかを示すマークを末尾に追加した文章を出力するようになりました。
これは正規表現中のコンパイル中に発生したとき、パターンのどの位置で 発生したかを示すマークを末尾に追加した文章を出力するようになりました。
"\c%c" is more clearly written simply as "%s"
これは正規表現中のコンパイル中に発生したとき、パターンのどの位置で 発生したかを示すマークを末尾に追加した文章を出力するようになりました。
Non-octal character '%c' terminates \o early. Resolved as "%s"
これは正規表現中のコンパイル中に発生したとき、"terminates \o early" という 文言と、パターンのどの位置で 発生したかを示すマークを末尾に追加した文章を出力するようになりました。 一部の場合では、解決法の文章が明確化されました。
Perl 5.32 から、このメッセージは生成されなくなりました。 代わりに、 "Non-octal character '%c' terminates \o early. Resolved as "%s"" in perldiag が使われます。
Use of code point 0x%s is not allowed; the permissible max is 0x%X
一部の場合では、以前は 16 進数 A
, B
, C
, D
, E
, F
が小文字で出力されていました。i これらは一貫して大文字になりました。
以下の三つの診断メッセージは削除され、 Expecting interpolated extended charclass in regex; marked by <-- HERE in m/%s/
: Expecting close paren for nested extended charclass in regex; marked by <-- HERE in m/%s/
, Expecting close paren for wrapper for nested extended charclass in regex; marked by <-- HERE in m/%s/
, Expecting '(?flags:(?[...' in regex; marked by <-- HERE in m/%s/
に 置き換えられました。
この大きさの符号位置はもはや 32 ビットプラットフォームでは 有効ではなくなったので、 Code point 0x%X is not Unicode, and not portable
警告から Code points above 0xFFFF_FFFF require larger than a 32 bit word.
という 行が削除されました。
エラーメッセージは、 Can't use global %s in "%s"
から少し変更され、 特に Can't use global $_ in "my"
のような誤解を招くメッセージは Can't use global $_ in subroutine signature
と表示されるようになりました。
Constants from lexical variables potentially modified elsewhere are no longer permitted
このエラーメッセージは、 以前廃止予定だった使用法が例外に変更されたことを反映して、 Constants from lexical variables potentially modified elsewhere are deprecated. This will not be allowed in Perl 5.32
から置き換えられました。 また、このメッセージのクラス分けは、D (deprecated) から F (fatal) に 変更されました。
"Incompatible Changes" も参照してください。
以前 \N{} in inverted character class or as a range end-point is restricted to one character
が出力されていた状況では、 \N{} here is restricted to one character
が出力されるようになりました。
これは、以前の言葉遣いでは対応できない Perl 5.30 で追加された状況のためです。
The bug tracker homepage URL now points to GitHub.
これは新しいツールで、IO::Compress::Base の更新の一部として 含まれるようになりました。
streamzip は標準入力から zip ファイルを作ります。 プログラムは標準入力からデータを読み込み、zip コンテナに圧縮して、 デフォルトでは、標準出力にストリーム zip ファイルを出力します。
clang++ のために、 futimes
, strtoll
, strtoul
, strtoull
, strtouq
のための Configure のプローブに #include <stdlib.h>
を追加しました; さもなければプローブはコンパイルに失敗します。
clang++ がより確実に検出できるように、 lchown
のためのコンパイルとテスト実行を使います。
C++ コンパイラのために、getpgrp
と setpgrp
のための Configure のプローブに #include <stdio.h>
を追加しました; これらは printf を使っていて、C++ コンパイラは単に警告を出すのではなく コンパイルに失敗するからです。
コンパイラがインライン属性を扱えるかをチェックします。
文字データアライメントをチェックします。
Configure は正しく gcc-10 を扱えるようになりました。 以前はこれは gcc-1 と解釈され、-fpcc-struct-return
が 有効になっていました。
Perl はもはや d_u32align
をプローブしなくなり、全ての プラットフォームで define
がデフォルトになりました。 このチェックは、32 ビットプラットフォームだけで成功したときに エラーを起こしがちでした。 [perl #133495]
Z/OS (ネイティブ EBCDIC) で perl をビルドするための文書とヒントが 更新されました。 これはまだ作業中です。
malloc_usable_size
のための新しいプローブが追加されました。
C++ と clang++ での検出のための Configure の改善。 作業は Andy Dougherty によって継続中です。 [perl #134171]
autodoc.pl
この、perlintern と perlapi を再生成するツールは大幅に見直され、 embed.fnc と Devel::PPPort で使われているフラグの一貫性が復元され、 コード中の多くの冗長な =for apidoc
を削除できるようになりました。
ECHO
が定義されるようになりました。 これは元々 FreeBSD で変更された dtrace
規則で使われており、 もちろん FreeBSD の make はこれを事前定義しています。 Solaris の make は、Solaris でのこの規則を壊す ECHO
を事前定義しません。 [perl #134218]
Bison バージョン 3.1 から 3.4 に対応しました。
このリリースのその他の追加と変更を反映してテストが追加、変更されました。 さらに、主に以下のような変更が行われました:
t/run/switches.t はもはや t/ の下の tmpinplace/ ディレクトリを 使用(および再使用)しなくなりました。 これは誤った失敗を防ぎます。 [GH #17424]
POSIX::mbtowc
の様々なバグが修正されました。 他のスレッドとの競合の可能性が排除され、以前は返されたワイド文字が ごみになっていることがありました。
POSIX::wctomb
の様々なバグが修正されました。 他のスレッドとの競合の可能性が排除され、また文字列引数が 共有されていたり結果を保持するのに十分な長さの文字列が事前に 割り当てられていない場合、セグメンテーションフォルトを起こしていました。
制御文字や Unicode を含むスカラを出力する一部のテストは EBCDIC で 修正されました。
t/charset_tools.pl: ASCII プラットフォームで動作しないようになりました。
t/re/regexp.t: ASCII プラットフォームでの多くの正規表現テストが高速化しました。
t/re/pat.t: EBCDIC で動作しないテストをスキップします。
Windows CE で perl をビルドする対応は削除されました。
cc
が clang
のとき、cc
は plibpth
を使っていました。 [perl #134189]
NetBSD 8.0 で g++ を使った Perl のコンパイルを修正しました。 [GH #17381]
POSIX プラットフォームと同様、 ccflags
と optimize
の設定は分離されました。 [GH #17156]
Visual C++ 6.0 で perl をビルドする対応は削除されました。
Win32 でのロケールテストは、Windows のバグおよび、 ロケール名が現在のコードページで適切にエンコードされていないと CRT が例外を投げるという別の問題により、クラッシュすることがありました。
2 番目の問題のために、ロケール名は自分自身でデコードし、 常にそれを UTF-8 としてデコードするようになりました。 [perl #133981]
FOO
で始まる環境変数が既に存在しているとき、 t/op/magic.t が失敗することがありました。
MYMALLOC (PERL_MALLOC) ビルドは修正されました。
Configure
は、/opt/developerstudio*
の下にある、 最近のバージョンの Oracle Developer Studio コンパイラを探すようになりました。
Configure
は gethostby*
関数で検出された型を使うようになりました; これにより、Perl が再び Solaris のある種の設定で コンパイル出来るようになりました。
パッチキット C99 V2.0 のリリースにより、 VSI は以前は不足していた多くの C99 機能の対応を提供するようになりました。 このパッチキットがインストールされているシステムでは、 Perl の設定プロセスは、stdint.h
ヘッダおよびつぎの関数の存在を 検出するようになりました: fpclassify
, isblank
, isless
, llrint
, llrintl
, llround
, llroundl
, nearbyint
, round
, scalbn
, scalbnl
.
-Duse64bitint
は VMS でデフォルトになりました。
Perl 5.32 は z/OS 2.4 でテストされていますが、以下の問題があります:
(デフォルトの)静的ビルドのみが安定しています。
ロケールを使うとき、z/OS は LC_MESSAGES
カテゴリと適切に扱えないので、 perl をコンパイルするとき、次の Configure オプションを追加するべきです:
./Configure <other options> -Accflags=-DNO_LOCALE_MESSAGES
z/OS はスレッドでのロケールに対応していないので、スレッド対応 perl を ビルドするときに、次の Configure オプションを追加するべきです:
./Configure <other Configure options> -Accflags=-DNO_LOCALE
perl と共に出荷される CPAN モジュールの一部は、そのセルフテストの 少なくとも一つが失敗します。 そのモジュールは: Archive::Tar, Config::Perl::V, CPAN::Meta, CPAN::Meta::YAML, Digest::MD5, Digest::SHA, Encode, ExtUtils::MakeMaker, ExtUtils::Manifest, HTTP::Tiny, IO::Compress, IPC::Cmd, JSON::PP, libnet, MIME::Base64, Module::Metadata, PerlIO::via-QuotedPrint, Pod::Checker, podlators, Pod::Simple, Socket, and Test::Harness.
失敗の理由は、モジュールは実際には正しく動くけれどもセルフテスト自身に 欠陥があるものから、モジュールが EBCDIC プラットフォームでは全く動かない 場合まで様々です。
savepvn
の len 引数は、I32
ではなく Size_t
になりました; 31 ビットを超える長さの文字列を扱えるからです。
字句解析器 (toke.c の Perl_yylex()
) は、以前は単一の 4100 行の関数で、 動作するために goto
および大量の広いスコープを持ったローカル変数に とても依存していました。 これは数十のより小さい静的関数の関数に分割されました; 残った最大の塊 (yyl_word_or_keyword()
) は 900 行を少し超える程度で、 単一の switch
文で構成されており、全ての case
グループは 独立しています。 これで理解と保守が大幅に容易になったはずです。
perl コアで使われている OS レベルシグナルハンドラと型 (Sighandler_t) は 3 引数を持つとして宣言されていましたが、 OS は常に 1 引数で呼び出すとしていました。 これは、1 引数として宣言するように修正されました。 完全な詳細についてはマージコミット v5.31.5-346-g116e19abbf
を 参照してください。
tr///
を扱うコードは広範囲に見直され、様々なバグが修正されました; 特にソース文字列や置換文字列に 255 を超える符号位置の文字が含まれている 場合です。 これらのバグの一部は文書化されておらず、 一部は(しかし全てではない) /s
の状況の下で起こり、 圧縮が置換文字列ではなくソース文字列を基として行われていました。 修正されたバグの文書は [perl #125493] です。
UTF-8 エンコードされた Unicode 文字列を扱う XS 作者のための 新しいマクロ "UTF8_CHK_SKIP
" in perlapi が作成されました; これは、不正な UTF-8 入力に直面したとき、"UTF8_SKIP
" in perlapi より 安全です (しかし "UTF8_SAFE_SKIP
" in perlapi ほど安全ではありません)。 これは NUL 文字を超えて読むことはありません。 これは Devel::PPPort 3.55 以降にバックポートされました。
PL_curstackinfo->si_cxsubix
フィールドが追加されました。 これは一番最近プッシュされたサブルーチン/フォーマット/evalコンテキストの スタックインデックスを記録します。 これは cx_pushsub()
, cx_popsub()
などによって自動的に設定および 復旧されますが、コンテキストスタックに普通でない操作を行った場合は 手動で管理する必要があるでしょう。
UTF-8 でエンコードされている入力に対して文字型のクラス分けや 大文字小文字変換を扱う様々なマクロは、 バッファの末尾を超えて読み込む可能性を避けるために追加の引数が必要になりました。 これらの使用は Perl 5.26 から廃止予定警告が出ていました。 詳細は "In XS code, use of various macros dealing with UTF-8." in perldeprecation に あります。
新しいパーサ関数 parse_subsignature() は、 use feature 'signatures'
が有効のときに、 サブルーチンシグネチャをパースするキーワードプラグインが可能になります。 これにより、シグネチャを含む通常の sub
宣言と似た文法を実装する カスタムキーワードが可能になります。 [perl #132474]
一部のプラットフォームでは一時的にロケールを切り替えるときに ミューテックスを保持する必要があるので、 [perl #134172] の 一部として、これを安全かつ効率的により簡単に行うために、 新しいマクロ (STORE_LC_NUMERIC_SET_TO_NEEDED_IN
, WITH_LC_NUMERIC_SET_TO_NEEDED
, WITH_LC_NUMERIC_SET_TO_NEEDED_IN
) が 追加されました。
OP 構造を割り当てるためのメモリ管理のオーバーヘッドは、 64 ビットシステムの OP では 8 バイト減少しました。
eval_pv() は、croak_on_error
が真のときにもはや 例外を文字列化しなくなりました。 [perl #134175]
PERL_DESTRUCT_LEVEL 環境変数は、以前は DEBUGGING 対応で ビルドされたバイナリでのみ有効でした。 これは全ての perl ビルドでチェックするようになりました。 この通常の使用法は、終了前に割り当てられたメモリのブロックを個々に 解放することを perl に強制するもので、 valgrind のような自動リーク検出ツールを使うときに有用です。
API eval_sv() は G_RETHROW
フラグを受け付けるようになりました。 このフラグがセットされていて、指定されたコードのコンパイル中や 実行中に例外が投げられた場合、 再スローされ、eval_sv() は返りません。 [perl #134177]
[perl #2754] の修正の 一部として、perl_parse() は、 exit(0) が BEGIN
, UNITCHECK
, CHECK
ブロックのいずれかから 呼ばれたときには非 0 を返すようになりました。
コンパイル中に op 木を再帰的に探索していたほとんどの関数は 再帰しなくなりました。 これにより、(特に自動生成された場合に) op 木が $n == 1 ? "one" : $n == 2 ? "two" : ....
のように深くネストしている場合に、 スタックオーバーフローにより SEGV するのを回避します。
スレッドはデフォルトで比較的少ないスタックしか持っていないので、 これはコードが別々のスレッドでコンパイルされたときに特に顕著です。
以前の "require" in perlfunc は、 特殊なビルドイン SV &PL_sv_undef
が %INC
の値としてある場合にのみ前回の require
が失敗したものとして扱い、 その他の未定義の SV がある場合は以前の require
は成功したものとして 扱っていました。 これは local %INC = %INC;
のような場合に想定外に require
が 成功することがありました。 これは修正されました。 [GH #17428]
正規表現の (?{...})
eval グループはもはや 想定外に "EVAL without pos change exceeded limit in regex" を 引き起こさなくなりました。 [GH #17490].
(?[...])
拡張大かっこ文字クラスは、事前にコンパイルされていた クラスが他のものに挿入された一部の場合で間違ってエラーを 発生させなくなりました。 以前使われていた経験則はより信頼性のある手法に置き換えられたので、 生成される診断メッセージが変更されました。 "Diagnostics" を参照してください。
((適切なオプション付きの -Dr
や use re
を指定することによる) コンパイルされた Unicode 特性ワイルドカート部分パターンの デバッグ表示は、もはや余分な出力をしなくなりました。
正規表現エンジンのアサート失敗が修正されました。 [GH #17372]
B::UNOP_AUX::aux_list()
の後の pp_hot.c のコアダンプが修正されました。 [GH #17301]
IO の読み込みはスレッドセーフになりました。 [GH #14816]
\p{user-defined}
は公式な Unicode を上書きします [GH #17025]
このパッチ以前では、上書きは一部の場合にのみ有効でした。
埋まっている /il
regnode と複数文字畳み込みを適切に扱えるようになりました
make minitest 中のコンパイルエラー [GH #17293]
%-
, %+
の実装はコアに移りました。
grok_inf_nan
のバッファを超えた読み込み [GH #17370]
LC_MESSAGES
に関する glibc バグの回避 [GH #17081]
printf()
や sprintf()
の %n
フォーマットは、 デバッグビルドでは panic したり、 SVfUTF8
フラグ付きの文字列を生成するときに誤ったキャッシュされた長さを 報告していました。 [GH #17221]
multiconcat
演算子に最適化された裸の単語定数は use strict "subs"
が強制されるようになりました。 [GH #17254]
正規表現パターンのメモリリークが修正されました。 [GH #17218]
Perl はもはや、文字列から数値に変換するときに、"0x" や "0b" で始まっている 文字列をそれぞれ 16 進数や 2 進数と扱わなくなりました。 これは、文字列から浮動小数点数に変換するときの精度を改善することを 目的として、perl 5.30.0 で不注意によって導入された振る舞いの変更を 元に戻します。 [perl #134230]
Unicode リテラルを含む正規表現に対して非 SVf_UTF8
文字列を マッチングさせると、マッチングを試行する毎に SV が リークすることがありました。 [perl #134390]
8 進および 2 進浮動小数点数リテラルのオーバーロードでは、 適切な 0
および 0b
接頭辞ではなく、 常に 0x
接頭辞付きの文字列が渡されていました。 [perl #125557]
$@ = 100; die;
は、100 を無視することなく、正しく例外として 伝搬するようになりました。 [perl #134291]
0 0x@
はもはや S_no_op() でアサートしなくなりました。 [perl #134310]
$@
が読み込み専用のときに例外が投げられると、 perl が $@
を更新しようとして新しい例外が発生するので、 無限再帰を起こしてスタックオーバーフローとなることがありました。, Perl は、$@
が単純な書き込み可能な SV ではない場合、 コピーで置き換えるようになりました。 [perl #134266]
$)
への設定は、適切な権限があれば、正しく補助グループ ID を 設定するようになりました。 [perl #134169]
パイプに対する close() は、IO SV からの PerlIO オブジェクトを予防的に クリアするようになりました。 これは、シグナルハンドラが die() または exit() を呼び出した一方、 close() は子プロセスの完了を待っている場合に、 既に閉じた PerlIO オブジェクトを再び閉じようとすることを防ぎます。 [perl #122112]
sprintf("%.*a", -10000, $x)
は、負数の精度の扱いの誤りにより バッファオーバーフローを引き起こすことがありました。 [perl #134008]
リファレンスに対する scalar() はコンパイル中に誤ったアサート失敗を 引き起こすことがありました。 [perl #134045]
%{^CAPTURE_ALL}
は、誤って %+
の別名になっていましたが、 文書通り %-
の別名になりました。 [perl #131867]
@{^CAPTURE}
に先に言及されていた場合、 %{^CAPTURE}
は動作していませんでした。 Similarly for %{^CAPTURE_ALL}
と @{^CAPTURE_ALL}
でも同様でしたが、 現在 @{^CAPTURE_ALL}
は使われていません。 [perl #134193]
(2GB を超える) 異常に大きい浮動小数点数幅は、 基となる snprintf() の整数オーバーフローを引き起こし、 アサートとなっていました。 フォーマットされた浮動小数点数幅は、snprintf() の返り値である int の幅に制限されました。 [perl #133913]
"${code here}"
や s/.../code here/e
のような) 部分パースの中の次のような構文のパースは、通常通りパースされたときと 一致するように変更されました:
print $fh ...
はもはや文法エラーにならなくなりました。
s/.../ ${time} /e
のようなコードは、警告が有効の場合に 適切に "Ambiguous use of ${time} resolved to $time at ..." 警告を出力するようになりました。
部分パースでの (スペース付きの) @x {"a"}
は、 警告が有効の場合に適切に "better written as" 警告を出力するようになりました。
属性を部分パースの中で使えるようになりました。 [perl #133850]
0x
や 0b
のような不完全な 16 進または 2 進リテラルは、 x
や b
は次のトークンの一部であるかのように扱われるようになりました。 [perl #134125]
s/.../code here/e
や "...${code here}"
のような 部分パース中の誤った )
はもはやパーサを混乱させなくなりました。
以前は部分パースは生成された (
および )
トークンで囲まれていたので、 誤った )
は通常の部分パースの後片付けをせずに構文を閉じることになり、 パーサを混乱させて、アサート失敗となる場合がありました。
このような構文は、ソース中に含むことのできない人工的な トークンで囲まれるようになりました。 [perl #130585]
\&foo = \&bar;
のようなサブルーチンへのリファレンス代入は、 main::
パッケージでは暗黙に何もしていませんでした。 [perl #134072]
sv_gets() は、ターゲット SV がシグナルハンドラによって変更されたときに よりよく回復するようになりました。 [perl #134035]
readline @foo
は @foo
をスカラコンテキストで評価するようになりました。 以前は、これはリストコンテキストとして評価され、 readline() はスタックから一つの引数しかポップしないので、 スタックがアンダーフローしたり、スタックに想定外の値が残ったりしていました。 [perl #133989]
不完全な 16 進や 2 進のリテラルは、単なる 0 のリテラルと扱われるように 5.31.1 で変更されました。 これは暗黙の振る舞いの変更を引き起こすことがあったので、 不完全な 16 進または 2 進リテラルは致命的エラーを出力するようになりました。 [perl #134125]
eval_pv() の croak_on_error フラグは、例え例外が 偽のオーバーロードされた値でも例外を投げるようになりました。 [perl #134177]
INIT
とプログラム自身は、 exit(0) が BEGIN
, UNITCHECK
, CHECK
ブロックの中で呼ばれると、 もはや実行されなくなりました。 [perl #2754]
open my $fh, ">>+", undef
は追記モードで一時ファイルを開くようになりました: 書き込むと書き込みの前にファイルの末尾にシークします。 [perl #134221]
副ツリーに OP_MULTIDEREF を含む op に関する未定義値警告を検索するときの SEGV を修正しました。 [perl #134275]
Perl と Raku のコミュニティの不可欠な部分であり、私たち全ての 親友であった Jeff Goff (JGOFF あるいは DrForr) は、 2020 年 3 月 13 日に亡くなりました。 DrForr はコミュニティの突出したメンバーであり、 数え切れないほどのイベントで参加や登壇を行い、 数多くのプロジェクト貢献し、 彼のできるあらゆる方法で支援や助力をしていました。
彼の死によって私たちの心とコミュニティには穴が空いたようで、 とても残念です。
Perl 5.32.0 は、Perl 5.30.0 以降、89 人の作者によって、 1,800 のファイルに約 220,000 行の変更を加えて、 約 13 ヶ月開発されてきました。
自動生成ファイル、文書、リリースツールを除くと、880 の .pm, .t, .c, .h ファイルに約 140,000 行の変更を加えました。
Perl は、活気のあるユーザーと開発者のコミュニティのおかげで 30 年を超えて 繁栄しています。 以下の人々が、Perl 5.32.0 になるための改良に貢献したことが分かっています:
Aaron Crane, Alberto Simões, Alexandr Savca, Andreas König, Andrew Fresh, Andy Dougherty, Ask Bjørn Hansen, Atsushi Sugawara, Bernhard M. Wiedemann, brian d foy, Bryan Stenson, Chad Granum, Chase Whitener, Chris 'BinGOs' Williams, Craig A. Berry, Dagfinn Ilmari Mannsåker, Dan Book, Daniel Dragan, Dan Kogai, Dave Cross, Dave Rolsky, David Cantrell, David Mitchell, Dominic Hargreaves, E. Choroba, Felipe Gasper, Florian Weimer, Graham Knop, Håkon Hægland, Hauke D, H.Merijn Brand, Hugo van der Sanden, Ichinose Shogo, James E Keenan, Jason McIntosh, Jerome Duval, Johan Vromans, John Lightsey, John Paul Adrian Glaubitz, Kang-min Liu, Karen Etheridge, Karl Williamson, Leon Timmermans, Manuel Mausz, Marc Green, Matthew Horsfall, Matt Turner, Max Maischein, Michael Haardt, Nicholas Clark, Nicolas R., Niko Tyni, Pali, Paul Evans, Paul Johnson, Paul Marquess, Peter Eisentraut, Peter John Acklam, Peter Oliver, Petr Písař, Renee Baecker, Ricardo Signes, Richard Leach, Russ Allbery, Samuel Smith, Santtu Ojanperä, Sawyer X, Sergey Aleynikov, Sergiy Borodych, Shirakata Kentaro, Shlomi Fish, Sisyphus, Slaven Rezic, Smylers, Stefan Seifert, Steve Hay, Steve Peters, Svyatoslav, Thibault Duponchelle, Todd Rinaldo, Tomasz Konojacki, Tom Hukins, Tony Cook, Unicode Consortium, VanL, Vickenty Fesunov, Vitali Peil, Yves Orton, Zefram.
これはバージョンコントロール履歴から自動的に生成しているので、ほぼ確実に 不完全です。 特に、Perl バグトラッカーに問題を報告をしてくれた (とてもありがたい)貢献者の 名前を含んでいません。
このバージョンに含まれている変更の多くは、Perl コアに含まれている CPAN モジュール由来のものです。 私たちは Perl の発展を助けている CPAN コミュニティ全体に感謝します。
全ての Perl の歴史的な貢献者のより完全な一覧については、どうか Perl ソース 配布に含まれている AUTHORS を参照してください。
もしバグと思われるものを見つけたら、 https://github.com/Perl/perl5/issues にある perl バグデータベースを 確認してください。 Perl ホームページ、http://www.perl.org/ にも情報があります。
もしまだ報告されていないバグだと確信したら、 https://github.com/Perl/perl5/issues にイシューを登録してください。 バグの再現スクリプトを十分小さく、しかし有効なコードに切りつめることを 意識してください。
報告しようとしているバグがセキュリティに関するもので、公開されている イシュートラッカーに送るのが不適切なものなら、バグの報告方法の詳細について "SECURITY VULNERABILITY CONTACT INFORMATION" in perlsec を参照してください。
もし Perl 5 でなされた作業について Perl 5 Porters に感謝したいと考えたなら、 perlthanks
プログラムを実行することでそうできます:
perlthanks
これは Perl 5 Porters メーリングリストにあなたの感謝の言葉をメールします。
変更点の完全な詳細を見る方法については Changes ファイル。
Perl のビルド方法については INSTALL ファイル。
一般的なことについては README ファイル。
著作権情報については Artistic 及び Copying ファイル。