NAME

perl5320delta - perl v5.32.0 での変更点

DESCRIPTION

この文書は 5.30.0 リリースと 5.32.0 リリースの変更点を記述しています。

5.28.0 のような以前のリリースから更新する場合は、まず 5.28.0 と 5.30.0 の違いについて記述している perl5300delta を読んでください。

コアの拡張

isa 演算子

isa という名前の新しい実験的な二項演算子は、 与えられたオブジェクトが指定されたクラスまたはその派生クラスの インスタンスかどうかをテストします:

    if( $obj isa Package::Name ) { ... }

さらなる詳細については "Class Instance Operator" in perlop を参照してください。

Unicode 13.0 対応

詳しくは 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 で これについてさらに読むことができます。

新しい Unicode 特性 Identifier_StatusIdentifier_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) が利用可能なら、通常の関数を置き換えます。 これにより、ロケールがスレッドセーフなプラットフォームで実行されたとき、 これらの関数もスレッドセーフになります。

mblenmbtowc での文字列の長さの引数はオプションになりました; ソース文字列をパースする長さを実際の長さよりも短く制限したい場合にのみ 有用です。

アルファアサートはもはや実験的ではなくなりました

"(*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 で開発されるようになりました

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 番目以外の全ての場合は他の情報も表示されます。)

セキュリティ

[CVE-2020-10543] Buffer overflow caused by a crafted regular expression

ネストした正規表現量指定子の保管スペースの計算での 符号付き size_t 整数オーバーフローを引き起こすことがあります; これにより Perl の正規表現コンパイラが、 攻撃者が提供したデータの正規表現保管スペースの後ろに割り当てられた メモリを上書きするという、 ヒープバッファオーバーフローを引き起こすことがあります。

ターゲットシステムは、オーバーフローが起きる前に、ネストした量指定子の 部分的な十分な量のメモリが必要です。 この要求を 64 ビットシステムで満たすことはおそらくできないでしょう。

ManhND of The Tarantula Team, VinCSS (Vingroup のメンバー) によって 発見されました。

[CVE-2020-10878] Integer overflow via malformed bytecode produced by a crafted regular expression

正規表現エンジンの命令の間でのオフセットの整数オーバーフローにより、 コンパイルされた正規表現の中間言語状態が破壊されることがあります。 攻撃者はこの振る舞いを、Perl 正規表現のコンパイルされた形式に命令を 挿入することに悪用できます。

Hugo van der Sanden と Slaven Rezic によって発見されました。

[CVE-2020-12723] Buffer overflow caused by a crafted regular expression

正規表現の中間言語表現を最適化するために、 Perl の正規表現コンパイラが S_study_chunk() を再帰呼び出しすることで、 コンパイルされた正規表現の中間言語状態が破壊されることがあります。

Sergey Aleynikov によって発見されました。

追加の注意

Perl で書かれたアプリケーションは、攻撃者によって提供された正規表現を 評価している場合にのみ、前述の不具合に対して脆弱です。 このような方法で正規表現を評価することは、危険であることが知られています; 正規表現エンジンはこのような使用シナリオでのサービス不能攻撃から 守られていないからです。

互換性のない変更

ある種のパターンマッチング機能は、Unicode 特性値ワイルドカード部分パターンのコンパイル時に禁止されるようになりました

これらのほんの一部の機能は、不適切か、この作業を達成するのに 使われるアルゴリズムを妨害します。 完全なリストは "Wildcards in Property Values" in perlunicode にあります。

未使用関数 POSIX::mbstowcsPOSIX::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]

0xFF を超える符号位置の文字列に対する vec の使用は禁止されました

このような文字列は内部では UTF-8 で表現されていて、 vec はビット指向演算なので、おそらくこれらの文字列に対しては 想定外の結果になります。 これは perl 5.28.0 で廃止予定になっていました。

0xFF を超える符号位置に対する文字列ビット単位演算子

これらの使用法の一部は既に以前の廃止予定サイクルで不正なものになっていました。 perl 5.28.0 で廃止予定になっていた、残りの使用法も禁止されました。 perldeprecation を参照してください。

Sys::Hostname::hostname() は引数を許さなくなりました

この使用法は perl 5.28.0 から廃止予定でしたが、致命的エラーになりました。

範囲演算子での単なる文字列 "0" は数値として扱われるようになりました

以前は、範囲 "0" .. "-1" は "0" から "99" までの数値文字列の範囲を 生成していました; これは 0 .. -1 と同様に空リストを 生成するようになりました。 また、"0" .. "9" は以前は文字列のリストを生成していましたが、 整数のリストを生成するようになりました。

これは、先頭が "0" で始まる文字列を文字列として扱う特殊ケースのためで、 "00" .. "03" のような範囲は "00", "01", "02", "03" を生成しますが、 文字列 "0" は特に扱っていませんでした。 [perl #133695]

\K は先読みと後読みの言明では許されなくなりました

これは、想定外の振る舞いを引き起こし、望まれる振る舞いがどうあるべきか 誰も定義できなかったので、許されなくなりました。 [perl #124256]

性能改善

モジュールとプラグマ

更新されたモジュールとプラグマ

削除されたモジュールとプラグマ

文書

既存の文書の変更

私たちはこの文書で挙げられた変更を反映するように文書を更新しようとしています。 もし抜けている物を発見したら、 https://github.com/Perl/perl5/issues でイシューを開いてください。

それに加えて、以下のような変更が行われました。

perldebguts

perlapi

perldiag

perlfunc

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() の節は大きく刷新されました。

perlguts

perlhacktips

perlintro

perlipc

perlop

perlpod

perlport

perlreref

perlvar

perlapi, perlintern

perlxs

POSIX

それに加えて、以下のような変更が行われました。

診断メッセージ

次のような追加と変更が、警告や致命的エラーメッセージを含む診断出力に 行われました。 診断メッセージの完全な一覧については、perldiag を参照してください。

新しい警告メッセージ

新しいエラー

新しい警告

既存の診断メッセージの変更

ツールの変更

perlbug

streamzip

設定とコンパイル

Configure

テスト

このリリースのその他の追加と変更を反映してテストが追加、変更されました。 さらに、主に以下のような変更が行われました:

プラットフォーム対応

廃止されたプラットフォーム

Windows CE

Windows CE で perl をビルドする対応は削除されました。

プラットフォーム固有の注意

Linux

ccclang のとき、ccplibpth を使っていました。 [perl #134189]

NetBSD 8.0

NetBSD 8.0 で g++ を使った Perl のコンパイルを修正しました。 [GH #17381]

Windows
Solaris
VMS
z/OS

Perl 5.32 は z/OS 2.4 でテストされていますが、以下の問題があります:

内部の変更

バグ修正の抜粋

Obituary

Perl と Raku のコミュニティの不可欠な部分であり、私たち全ての 親友であった Jeff Goff (JGOFF あるいは DrForr) は、 2020 年 3 月 13 日に亡くなりました。 DrForr はコミュニティの突出したメンバーであり、 数え切れないほどのイベントで参加や登壇を行い、 数多くのプロジェクト貢献し、 彼のできるあらゆる方法で支援や助力をしていました。

彼の死によって私たちの心とコミュニティには穴が空いたようで、 とても残念です。

Acknowledgements

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 メーリングリストにあなたの感謝の言葉をメールします。

SEE ALSO

変更点の完全な詳細を見る方法については Changes ファイル。

Perl のビルド方法については INSTALL ファイル。

一般的なことについては README ファイル。

著作権情報については Artistic 及び Copying ファイル。