NAME

perl5420delta - perl v5.42.0 での変更点

DESCRIPTION

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

コアの拡張

More CORE:: subs

chdir がサブルーチンとしてCORE:: 名前空間に追加されました。

以前は、&CORE::chdir($dir)my $ref = \&CORE::chdir; $ref->($dir) の ようなコードは、&CORE::chdir cannot be called directly というエラーを 投げていました。 このような場合は、今では完全に対応しています。

New pragma source::encoding

これにより、このプラグマのレキシカルスコープの残りの部分のプログラム部分が 完全に ASCII (use source::encoding 'ascii' の場合)または UTF-8 も許可されている場合(use source::encoding 'utf8'の場合)の いずれかでエンコードされることを宣言できます。 他のエンコーディングは受け入れられません。 2 番目の形式は完全に use utf8 と等価であり、これと同じ意味で 使えます。

このプラグマの目的は、use utf8 の指定を忘れたケースを早期に 検出することです。

use source::encoding 'ascii' は、use v5.41.0 以降の レキシカルスコープ内では自動的に有効になります。

no source::encoding は、そのレキシカルスコープの残りの部分について、 このチェックをすべてオフにします。 そして非 ASCII 文字の意味は未定義です。

New :writer attribute on field variables

:reader がすでに読み込みアクセサを作成しているのと同様に、 :writer 属性を使って :use feature'class' で定義されたクラスが スカラフィールドの書き込みアクセサを自動的に作成できるようになりました。

class Point {
    field $x :reader :writer :param;
    field $y :reader :writer :param;
}

my $p = Point->new( x => 20, y => 40 );
$p->set_x(60);

New any and all operators

二つの新しい実験的機能が追加されました; リスト処理演算子 anyall です。

use v5.42;
use feature 'keyword_all';
no warnings 'experimental::keyword_all';

my @numbers = ...

if ( all { $_ % 2 == 0 } @numbers ) {
    say "All the numbers are even";
}

これらのキーワードは grep と同様に動作しますが、真または偽のみを返し、 リスト内のいずれか(またはすべて)の要素がテストブロックの結果を 真にするかどうかをテストする点が異なります。 このため、これらは短絡することができ、特定の要素が最終的な結果を決定した場合に、 それ以上の要素をテストする必要がなくなります。

これらは、List::Util モジュールの同じ名前の関数から着想を得たものですが、 直接コア演算子として実装されているため、より高速に実行され、 コードブロックを呼び出すための追加のサブルーチン呼び出しスタックフレームを 生成しない点が異なります。

これらのキーワードを有効にする機能フラグは、:all エクスポートタグを使って すべての機能を参照する feature モジュールの機能との混乱を避けるために、 keyword_any および keyword_all という 名前が付けられています。 [GH #23104]

したがって、関連する実験的な警告フラグは、 experimental::keyword_anyexperimental::keyword_all および experimental::keyword_anyおよびexperimental::keyword_all という 名前になります。

Apostrophe as a global name separator can be disabled

これは Perl 5.38 では非推奨であり、予定通り perl 5.41.3 では削除されましたが、 いくつかの議論の後、デフォルトで復活しました。

これは apostrophe_as_package_separator 機能で制御できます; この機能はデフォルトで有効になっていますが、5.41 以降の機能の束では 無効になっています。

自身のコード内での使用を無効にしたい場合は、この機能を明示的に 無効にすることができます:

no feature "apostrophe_as_package_separator";

この機能を無効にすると、コード内のパッケージ区切り文字として アポストロフィが使用できなくなるだけです; この機能を無効にしても、シンボリック参照は ':: として扱います。

my $symref = "My'Module'Var";
# default features
my $x = $My'Module'Var; # fine
no feature "apostrophe_as_package_separator";
no strict "refs";
my $y = $$symref;       # like $My::Module::Var
my $z = $My'Module'Var; # syntax error

[GH #22644]

Lexical method declaration using my method

Perlバージョン 5.18 以降の sub と同様に、method の前に my キーワードを付けることができるようになりました。 これは、パッケージの可視性ではなく、レキシカルな可視性を 持つサブルーチンを宣言します。 さらなる詳細については、perlclass を参照してください。

Lexical method invocation operator ->&

メソッドをレキシカルに宣言する機能に加えて、このリリースでは、通常の 名前ベースのメソッド解決を迂回して、メソッドであるかのように レキシカルサブルーチンを呼び出すこともできます。

レキシカルメソッド宣言と組み合わせることで、これら二つ新しい機能は プライベートメソッドを持つ効果を生み出します。

Switch and Smart Match operator kept, behind a feature

"switch" 機能と、スマートマッチング演算子 ~~ は、v5.10 で導入されました。 これらの振る舞いは v5.10.1 で大きく変更されました。 「実験的」制度が v5.18.0 で追加されたとき、 switch とスマートマッチングは、遡及的に実験的と宣言されました。 長年にわたって、機能を修正または補完する提案が現れては消えていきました。

これらは Perl v5.38.0 では非推奨であり、Perl v5.42.0 では削除が 予定されていました。 広範な議論の後、これらの削除は無期限に延期されました。 これらを使っても、非推奨の警告は生成されなくなりました。

switch 自体は依然として switch 機能を必要とします; この機能は、v5.9.5 から v5.34 までの機能の束ではデフォルトで 有効になっています。 switch は 5.35 以降の機能の束では無効のままですが、個別に 有効にすることができます:

# no switch here
use v5.10;
# switch here
use v5.36;
# no switch here
use feature "switch";
# switch here

スマートマッチングでは、smartmatch 機能が必要になりました; この機能はデフォルトで有効になっており、5.40 までのすべての機能の束に 含まれています。 5.41 以降の機能の束では無効になっていますが、個別に有効にすることができます。

# smartmatch here
use v5.41;
# no smartmatch here
use feature "smartmatch";
# smartmatch here

[GH #22752]

Unicode 16.0 supported

Perl は、Unicode 15.1 https://www.unicode.org/versions/Unicode15.1.0/ で 導入された変更を含め、 16.0 https://www.unicode.org/versions/Unicode16.0.0/ に 対応するようになりました。

Assigning logical xor ^^= operator

Perl 5.40.0 では、論理中置排他的論理和演算子 ^^ が導入されました。 この時点では、代入版 ^^= も欠落していることに気づきませんでした。 これが追加されました。

Security

[CVE-2024-56406] Heap buffer overflow vulnerability with tr//

Perl でヒープバッファオーバーフローの脆弱性が発見されました。

tr 演算子の左側に非 ASCII バイトがある場合、S_do_trans_invmap() は 宛先ポインタ d をオーバーフローさせることがあります。

$ perl -e '$_ = "\x{FF}" x 1000000; tr/\xFF/\x{100}/;'
Segmentation fault (core dumped)

この脆弱性により、十分な防御機能を備えていないプラットフォームで サービス拒否攻撃や任意コード実行攻撃が発生する可能性があると 考えられています。

この問題は Nathan Mills によって発見され、 CPAN Security Group によって[CVE-2024-56406] が 割り当てられました。

この問題を修正するパッチ(87f42aa0e0096e9a346c9672aa3a0bd3bef8c1dd) は、サポート対象外のものを含め、 脆弱な全ての Perl に適用できます。

[CVE-2025-40909] Perl threads have a working directory race condition where file operations may target unintended paths

Perl スレッドのクローン化には、ファイル操作が意図しないパスを ターゲットにする可能性がある作業ディレクトリの競合状態がありました。 Perl 5.42 では、各ハンドルへの chdir がなくなりました。

この問題は、[GH #23010] を介して Vincent Lefèvreによって発見され、 CPAN Security Groupによって [CVE-2025-40909]が 割り当てられました。

修正は、[GH #23019] および [GH #23361] を通じて 提供されました。

互換性のない変更

Removed containing function references for functions without eval

Perl 5.40 では、デバッガで使用されるパッケージ DB 内の eval EXPR の 特殊な動作を破壊する Perl 5.18 で導入されたバグを修正するために、 関数からその関数を含む関数への無条件参照が再導入されました。

場合によっては、この変更により、クロージャと他の既存の参照との間で 循環参照チェーンが発生し、メモリリークを引き起こしていました。

この変更は元に戻され、 [GH #22547] は修正されましたが、 [GH #19370] は再び 壊れました。

これは、参照ループが発生しないこと、および囲んでいる関数からの レキシカル変数および関数がデバッガで表示されない可能性があることを 意味します。

関数内でeval EXPR を呼び出すと、常にそうであるように、 無条件にその関数を囲む関数を参照することに注意してください。

性能改善

モジュールとプラグマ

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

文書

既存の文書の変更

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

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

perlapi

perldata

perlfunc

perlgov

perlguts

perlop

perlvar

診断メッセージ

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

新しい警告メッセージ

新しいエラー

新しい警告

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

Utility Changes

Porting/test-dist-modules.pl

設定とコンパイル

テスト

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

プラットフォーム対応

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

arm64 Darwin

Configure で use64bitall を使用するときの arm64 darwin のヒントを 修正しました。 [GH #22672]

Android

[GH #22627] に関連して Android の perl_langinfo.h [GH #22650] を変更しました。

Cygwin

cygwin.c: いくつかのばかげた/ひどい C エラーを修正しました。 [GH #22724]

cygperl*.dll に対して、--enable-auto-image-base によって生成された ベースアドレスと競合しない明示的なベースアドレスを指定しました。 [GH #22695] [GH #22104]

MacOS (Darwin)

MacOS 15 (Darwin 24) 以降でロケールを使用した文字列の照合は、 libc でのアサーションの失敗によりオフになっています。

以前のバージョンでも(locale.t での失敗など)問題が発生している場合は、 ./Configure の起動に -Accflags=-DNO_LOCALE_COLLATE オプションを 追加するか、config.shccflags および cppflags 変数に -DNO_LOCALE_COLLATE を追加することで、ロケール照合を明示的に 無効にすることができます。

内部の変更

バグ修正の抜粋

Obituaries

Abe Timmerman

Abe Timmerman (ABELJE) は、2024 年 8 月 15 日に亡くなりました。

2002 年以来、Abe は Test::Smoke プロジェクトを構築し、維持してきました: これは、「できるだけ多くの構成で Perl コアテストを実行し、結果を 読みやすいレポートに結合しようとするスクリプトとモジュールのセット」です。 できるだけ多くのプラットフォームと構成で Perl を smoke することは、 バグを見つけ、それらのバグに対するパッチを開発するのに役立ちました。

Abeは、Perl Toolchain Summit (旧称 Perl QA Hackathon), Dutch Perl Workshop, Amsterdam.pm ユーザーグループミーティングに 定期的に参加していました。 彼の優しさと笑顔と笑いで、彼は Perl とそのコミュニティをより良くする 手助けをしました。

Abeltje のメモリアルカードには、「あらゆる機会をつかんで、 シャンパンを一杯飲みましょう。これがその機会です」と書かれていました。 私たちはあなたがいなくて寂しいです、 Abe, そして私たちはあなたの名誉のためにシャンパンを一杯飲みましょう。

Andrew Main

Andrew Main (ZEFRAM) は 2025 年 3 月 10 日に亡くなりました。

Zefram は聡明な人で、あらゆることに精通しているように見え、 彼の知識を喜んで伝え、彼の印象的な洞察を穏やかで技術的な態度で共有しましたが、 彼が本当に心を込めてコミュニケーションしていたことが 伝わらないこともしばしばありました。

Zefram が長年にわたって Perl の言語と文化の両方に与えてきた影響は、 いくら強調してもしすぎることはありません。 コードベースへの数え切れないほどの貢献から、 会議や集まりでのしばしば奇抜ではあるが常に特徴的な登場まで、 彼の影響力と記憶は将来にわたって長く続くことは間違いありません。

Zefram は、現実空間に特定の追悼の場所を持たないことを望んでいました。 サイバー空間における彼の追悼の場所は http://www.fysh.org/~zefram/personal/ です。

謝辞

Perl 5.42.0 は、Perl 5.40.0 以降、65 人の作者によって、 1,600 のファイルに約 280,000 行の変更を加えて、 約 13 ヶ月開発されてきました。

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

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

Aaron Dill, Andrei Horodniceanu, Andrew Ruthven, Antanas Vaitkus, Aristotle Pagaltzis, Branislav Zahradník, brian d foy, Chad Granum, Chris 'BinGOs' Williams, Craig A. Berry, Dabrien 'Dabe' Murphy, Dagfinn Ilmari Mannsåker, Dan Book, Daniel Dragan, Dan Jacobson, David Cantrell, David Mitchell, E. Choroba, Ed J, Ed Sabol, Elvin Aslanov, Eric Herman, Erik Huelsmann, Gianni Ceccarelli, Graham Knop, hbmaclean, H.Merijn Brand, iabyn, James E Keenan, James Raspass, Johan Vromans, Karen Etheridge, Karl Williamson, Leon Timmermans, Lukas Mai, Marek Rouchal, Marin Tsanov, Mark Fowler, Masahiro Honma, Max Maischein, Paul Evans, Paul Johnson, Paul Marquess, Peter Eisentraut, Peter John Acklam, Philippe Bruhat (BooK), pyrrhlin, Reini Urban, Richard Leach, Robert Rothenberg, Robin Ragged, Russ Allbery, Scott Baker, Sergei Zhmylev, Sevan Janiyan, Sisyphus, Štěpán Němec, Steve Hay, TAKAI Kousuke, Thibault Duponchelle, Todd Rinaldo, Tony Cook, Unicode Consortium, Vladimír Marek, Yves Orton.

これはバージョンコントロール履歴から自動的に生成しているので、ほぼ確実に 不完全です。 特に、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 ファイル。