NAME

perl5400delta - perl v5.40.0 での変更点

DESCRIPTION

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

コアの拡張

新しい __CLASS__ キーワード

新しい class 機能を使う場合、メソッド内のコード、ADJUST ブロックまたは フィールド初期化式は、新しい __CLASS__ キーワードを使えるようになりました。 これにより、__PACKAGE__ に似たクラス名が生成されますが、コードが 表示されるコンパイル時パッケージが生成されるのに対して、 __CLASS__ キーワードは、オブジェクトインスタンスがメンバである実際の 実行時クラスを認識します。 これにより、特に $self へのアクセスが許可されていないコンストラクタで、 そのクラスのメソッドディスパッチに便利になります。

さらなる詳細については、"__CLASS__" in perlfunc を参照してください。

フィールド変数のための :reader 属性

class 機能を使うとき、フィールド変数は :reader 属性を 取ることができるようになりました。 これは、指定されたインスタンスのフィールド値を返すだけの変数を自動的に 作成するように要求します。

    field $name :reader;

これは次と同等です:

    field $name;
    method name () { return $name; }

別名も提供できます:

    field $name :reader(get_name);

さらなる詳細については、":reader" in perlclass を参照してください。

-M コマンドラインオプションにスペースを許すように

コマンド行オプションを処理するとき、perl は -M オプションとその後の モジュール名の間にスペースを入れることができるようになりました。

    $ perl -M Data::Dumper=Dumper -E 'say Dumper [1,2,3]'

これは、既存の -I オプションの振る舞いと一致します。

use VERSION 宣言の制限

Perl 5.36 では、use VERSION 宣言をバージョン 5.11 より上のものから下のものに 降格する際に、非推奨警告が追加されました。 これは今回致命的エラーになりました。

さらに、どちらかのバージョンが 5.39 以上で、別のバージョンがスコープ内に あるとき、引き続く use VERSION 宣言を発行することは致命的エラーになりました。 これは、builtin からインポートされたレキシカル関数を取り巻く複雑さを 避けるためです。 その他のバージョン 5.39 未満の引き続く use VERSION 宣言に対しても、 Perl バージョン 5.44 では許されなくなることを 警告するはいしよてい警告が追加されました。

新しい builtin::inf 関数と builtin::nan 関数 (実験的)

二つの新しい関数、infnanbuiltin 名前空間に追加されました。 これらは、それぞれ浮動小数点数の無限大と非数値を生成する定数のように動作します。

新しい ^^ 排他的論理和演算子

Perl には、優先度の低い三つの論理演算子(and, or, xor)と、優先度の高い 三つのビット単位のバージョン(&, ^, |) が常にありました。 このリリースまでは、&&|| の中優先度の論理演算子もありましたが、 排他的論理和の同等物はありませんでした。 このリリースの Perl では、最後の^^演算子が追加され、集合が完成しました。

    $x ^^ $y and say "One of x or y is true, but not both";

try/catch 機能はもはや実験的ではありません

このリリースより前では、エラーを扱うための try/catch 昨日は 実験的と考えられていました。 Perl バージョン 5.34.0 で導入されたこれは、安定した言語機能として 考えられるようになり、使ってももはや警告を表示しなくなりました。 未だに 'try' 機能 で有効にしなければなりません。

"Try Catch Exception Handling" in perlsyn を参照してください。

for で一度に複数の値を反復するのはもはや実験的ではありません

このリリースより前では、for で一度に複数の値を反復するのは実験的と 考えられていました。 Perl バージョン 5.36.0 で導入されたこれは、安定した言語機能として 考えられるようになり、使ってももはや警告を表示しなくなりました。 "Compound Statements" in perlsyn を参照してください。

builtin モジュールはもはや実験的ではありません

このリリースより前では、builtin モジュールとその全ての関数は 実験的と考えられていました。 Perl バージョン 5.36.0 で導入されたこれは、安定した言語機能として 考えられるようになり、使ってももはや警告を表示しなくなりました。 しかし、この関数のいくつかは、未だに実験的と考えられています。

:5.40 機能の束は try を追加します

最新バージョンの機能の束には、最近安定化された機能 try が 含まれることになりました。 この機能の束は -E コマンドラインオプションによって使われるため、これらは -E スクリプトですぐに使えます。

use v5.40; は builtin 関数をインポートします

use v5.40; (または以降のバージョン) は、機能の束をインポートすることに 加えて、対応する buildtin のバージョンの束 を インポートします。

セキュリティ

CVE-2023-47038 - 不正なユーザー定義 Unicode 特性によるバッファ末尾を超えた書き込み

この脆弱性は、Nathan Mills the.true.nathan.mills@gmail.com によって Perl セキュリティチームに直接報告されました。

巧妙に細工された正規表現を perl 5.30.0 から 5.38.0 でコンパイルすると、 ヒープに割り当てられたバッファで、攻撃者が制御する 1 バイトの バッファオーバーフローが発生する可能性があります。

CVE-2023-47039 - Perl での Windows バイナリハイジャック脆弱性

この脆弱性は、 Intel Product Security Incident Response Team (PSIRT) が、GitHub ユーザーの ycdxsb https://GitHub.com/ycdxsb/WindowsPrivilegeEscalation から報告を受け、 PSIRT から Perl セキュリティチームに報告されました。

Windows 用の Perl は、シェル(cmd.exe)を見つけるためにシステムパス環境変数に 依存します。 Windows の Perl インタプリタを使う実行可能ファイルを実行する場合、Perl は オペレーティングシステム内の cmd.exe を見つけて実行しようとします。 しかし、パス検索順序の問題により、Perl は最初に現在の作業ディレクトリ内で cmd.exe を探します。

権限が制限された攻撃者は、cmd.exeC:\ProgramData などの弱い権限を 持つ場所に配置することで、この動作を不正利用できる可能性があります。 これにより、管理者がこれらの侵害された場所からこの実行可能ファイルを 使用しようとしたときに、任意のコードが実行される可能性があります。

互換性のない変更

reset EXPR はスカラに対して set-magic を呼び出すようになりました

以前の reset EXPR では、スカラ変数をクリアするときに set magic を 呼び出しませんでした。 これは、変更が $^W などの必要な場所で基礎となる内部状態に伝播されず、 $1 などの基礎となるマジックが通常例外を投げるような例外が発生しないことを 意味していました。

つまり、以前は何の効果もなかったコードが、実際には効果を持つようになり、 例外を投げる可能性もあります。

reset EXPR はすでに、配列とハッシュを変更するときに set magic を 呼び出しています。

これは、m?pattern? と同様に、一回のマッチング検索をリセットするために使われる 単純な reset には影響しません。

[GH #20763]

不明なパッケージの import メソッドを呼び出すと警告が発生します

歴史的には、定義されていないクラスも含めて、任意のクラスの import または unimport メソッドを引数付きで呼び出すことができ、エラーは 発生しませんでした。 たとえば、次のコードは Perl 5.38 ではエラーを投げません。

    Class::That::Does::Not::Exist->import("foo");

しかし、Perl 5.39.1 からこれは廃止予定になり、警告が起こります。 引数なしでこれらのメソッドを呼び出しても、暗黙に成功し、 何もしないままであることに注意してください。 例えば:

    Class::That::Does::Not::Exist->import();

これはエラーを投げません。 これは、全てのクラスが暗黙にクラス UNIVERSAL から継承しており、クラス UNIVERSALimport メソッドを定義しているためです。 以前の perl ではそのようなメソッドは定義されておらず、代わりに importunimport のメソッド呼び出しは、そのようなメソッドが定義されていない場合に エラーを投げないように特別扱いされていました。

この変更が追加されたのは、大文字小文字を区別しないファイルシステムで 実行するときに、use 文の大文字小文字のタイプミスをより簡単に 検出できるようにするためです。 例えば、大文字小文字を区別しないファイルシステムを使う Windows または その他のプラットフォームで 古い perl を使うと、次のコードは:

    use STRICT 'refs';

モジュールは実際には STRICT.pm ではなく strict.pm を呼び出されるため、 モジュールはロードされますが、そのインポートメソッドは呼び出されないので、 何もしません。 また、独自のインポートを提供しないパッケージを使っているときに、 ユーザが引数を渡す場合も検出されます; たとえば、ほとんどの「純粋な」クラス定義ではインポートメソッドが 定義されていません。

return はもはや間接オブジェクトを受け付けません

return 演算子の構文で、間接オブジェクトが拒否されるようになりました。 ほとんどの場合、これはコンパイルされて実行されますが、文書化されておらず、 例えば次のような混乱した結果になる可能性があります:

  # note that sum hasn't been defined
  sub sum_positive {
    return sum grep $_ > 0, @_;
    # unexpectedly parsed as:
    #   return *sum, grep $_ > 0, @_;
    # ... with the bareword acting like an extra (typeglob) argument
  }
  say for sum_positive(-1, 2, 3)

これは次を生成します:

  *main::sum
  2
  3

[GH #21716]

no feature "bareword_filehandles" の下でのメソッド呼び出しでは、クラスの裸の単語はもはやファイルハンドルとして解決されなくなりました

no feature "bareword_filehandles" の下で、裸の単語のファイルハンドルは メソッド呼び出しでは引き続き解決されていました:

    open FH, "<", $somefile or die;
    no feature 'bareword_filehandles';
    FH->binmode;

この問題は修正されたので:

    FH->binmode;

これは FH をクラスとして解決しようとし、典型的には 実行時エラーとなります。

STDOUTなどの標準のファイルハンドルは、引き続きハンドルとして解決されます。

    no feature 'bareword_filehandles';
    STDOUT->flush; # continues to work

一旦 perl がある裸の単語をクラスとして解決すると、それは継続して 行われることに注意してください:

    package SomeClass {
        sub somemethod{}
    }
    open SomeClass, "<", "somefile" or die;
    # SomeClass resolved as a handle
    SomeClass->binmode;
    {
        no feature "bareword_filehandles";
        SomeClass->somemethod;
    }
    # SomeClass resolved as a class
    SomeClass->binmode;

[GH #19426]

廃止予定

性能改善

モジュールとプラグマ

新しいモジュールとプラグマ

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

文書

既存の文書の変更

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

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

perlapi

perlclass

perlfunc

perlguts

perlclib

perlhacktips

perllol

perlre

perlref

perlop

perlport

perlvar

診断メッセージ

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

新しい警告メッセージ

新しいエラー

新しい警告

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

設定とコンパイル

テスト

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

プラットフォーム対応

新しいプラットフォーム

Serenity OS

すぐに使える Serenity OS 対応が追加されました。

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

Windows

/W4 を使用した MSVC でのいくつかのヘッダビルド警告を削除し、 埋め込み用のノイズを低減しました。 [GH #21031]

ほとんどの 32 ビット Mingw ビルドのバグを回避しました; これは、gcc サポートライブラリ内のコードを含む生成されたコードは、 32 ビット Windows では保持されない 16 バイトのスタックアライメントを 前提としているというものです。 [GH #21313]

MSVC に使われる組み込みの設定で、 copysign, signbit, acosh, asinh, atanh, exp2, tgamma を有効にしました。 [GH #21610]

ビルドプロセスは Visual Studio 2013 に対応しなくなりました。 これは非常に基本的なレベルでのビルドに失敗しており、そのような 失敗の報告はありませんでした。 [GH #21624]

Linux

ヒントファイルが更新され、Intel oneAPI DPC++/C++ コンパイラを 扱えるようになりました。

MacOS/Darwin

Mac OSX 10.5 上でビルドする場合は、MACOSX_DEPLOYMENT_TARGET を 設定しなくなりました。 [GH #21367]

VMS

configure の "installation prefix" プロンプトが、yes/no ではなく文字列を 受け入れるように修正されました。

perl_lc_all_category_positions_init に適切な値を定義することで、 コンパイルが修正されました。

config_H.SH を読み込む際のバッファサイズを増やし、clang の下での コンパイルを修正しました。

Oracle Developer Studio (Solaris, Oracle Linux)

明らかなコード生成のバグにより、Oracle Developer Studio(以前の Sun Workshop)コンパイラのデフォルトの最適化レベルは -xO1 になりました。 [GH #21535]

内部の変更

バグ修正の抜粋

既知の問題

以前のリリースの訂正

謝辞

Perl 5.40.0 は、Perl 5.38.0 以降、75 人の作者によって、 1,500 のファイルに約 160,000 行の変更を加えて、 約 11 ヶ月開発されてきました。

自動生成ファイル、文書、リリースツールを除くと、1,200 の .pm, .t, .c, .h ファイルに約 110,000 行の変更を加えました。

Perl は、活気のあるユーザーと開発者のコミュニティのおかげで 30 年を超えて 繁栄しています。 以下の人々が、Perl 5.40.0 になるための改良に貢献したことが分かっています:

Abe Timmerman, Alexander Kanavin, Amory Meltzer, Aristotle Pagaltzis, Arne Johannessen, Beckett Normington, Bernard Quatermass, Bernd, Bruno Meneguele, Chad Granum, Chris 'BinGOs' Williams, Christoph Lamprecht, Craig A. Berry, Dagfinn Ilmari Mannsåker, Dan Book, Dan Church, Daniel Böhmer, Dan Jacobson, Dan Kogai, David Golden, David Mitchell, E. Choroba, Elvin Aslanov, Erik Huelsmann, Eugen Konkov, Gianni Ceccarelli, Graham Knop, Greg Kennedy, guoguangwu, Hauke D, H.Merijn Brand, Hugo van der Sanden, iabyn, Jake Hamby, Jakub Wilk, James E Keenan, James Raspass, Joe McMahon, Johan Vromans, John Karr, Karen Etheridge, Karl Williamson, Leon Timmermans, Lukas Mai, Marco Fontani, Marek Rouchal, Martijn Lievaart, Mathias Kende, Matthew Horsfall, Max Maischein, Nicolas Mendoza, Nicolas R, OpossumPetya, Paul Evans, Paul Marquess, Peter John Acklam, Philippe Bruhat (BooK), Raul E Rangel, Renee Baecker, Ricardo Signes, Richard Leach, Scott Baker, Sevan Janiyan, Sisyphus, Steve Hay, TAKAI Kousuke, Todd Rinaldo, Tomasz Konojacki, Tom Hughes, Tony Cook, William Lyu, x-yuri, Yves Orton, Zakariyya Mughal, Дилян Палаузов.

これはバージョンコントロール履歴から自動的に生成しているので、ほぼ確実に 不完全です。 特に、Perl バグトラッカーに問題を報告をしてくれた (とてもありがたい)貢献者の 名前を含んでいません。

このバージョンに含まれている変更の多くは、Perl コアに含まれている CPAN モジュール由来のものです。 私たちは Perl の発展を助けている CPAN コミュニティ全体に感謝します。

全ての Perl の歴史的な貢献者のより完全な一覧については、どうか Perl ソース 配布に含まれている AUTHORS を参照してください。

バグ報告

もしバグと思われるものを見つけたら、 https://github.com/Perl/perl5/issues にある perl バグデータベースを 確認してください。 Perl ホームページ、https://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 ファイル。

POD ERRORS

Hey! The above document had some coding errors, which are explained below:

Around line 793:

=back without =over

Around line 804:

You forgot a '=back' before '=head3'