NAME

perl5380delta - perl v5.38.0 での変更点

DESCRIPTION

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

コアの拡張

新しい class 機能

オブジェクトクラスを定義するための新しい 実験的 文法が利用可能に なりました; これは、実体ごとのデータは、レキシカルのように振る舞う "field" 変数に保管されます。

    use feature 'class';

    class Point
    {
        field $x;
        field $y;

        method zero { $x = $y = 0; }
    }

これは perlclass に、より詳細が記述されています。 その実装の内部の注意とその他の関連する詳細については、 perlclassguts にあります。

これは新しく実験的な機能であり続け、非常に開発中です。 将来のリリースでさらに多くの追加、改良、変更が予定されています。 これは実験的なので、experimental::class カテゴリの警告が出ます。 これは no warnings 文で黙らせることができます。

    use feature 'class';
    no warnings 'experimental::class';

Unicode 15.0 に対応しました

詳しくは https://www.unicode.org/versions/Unicode15.0.0/ を 参照してください。

廃止予定警告はそれぞれ副カテゴリを持つようになりました

全ての廃止予定警告は、個別に無効化できるように、それぞれ固有の 廃止予定カテゴリを持つようになりました。 全ての廃止予定機能の一覧は perldeprecationwarnings にあります。 次の一覧は warnings からのものです:

         +- deprecated ----+
         |                 |
         |                 +- deprecated::apostrophe_as_package_separator
         |                 |
         |                 +- deprecated::delimiter_will_be_paired
         |                 |
         |                 +- deprecated::dot_in_inc
         |                 |
         |                 +- deprecated::goto_construct
         |                 |
         |                 +- deprecated::smartmatch
         |                 |
         |                 +- deprecated::unicode_property_name
         |                 |
         |                 +- deprecated::version_downgrade

未だに、次の一行で全ての廃止予定警告を無効にできます:

    no warnings 'deprecated';

しかし、より細かい制御ができるようになりました。 これまでと同様、次のようにするとこれらの警告は自動的に有効になります:

    use warnings;

%{^HOOK} API が導入されました

様々な理由により、いくつかの perl のキーワードのラッパサブルーチンを 作るのは難しいことがありました。 プロトタイプが未定義のキーワードは単にサブルーチンで ラッピングすることができず、perl がラッピングされることを許している いくつかのキーワードは実際にはラッピングするのが非常にトリッキーです。 例えば require はラッピングするのがトリッキーで、 可能ではありますが、そうするとスタックの深さが変わり、 エクスポートの標準手法は、パッケージをスタック上のあるスタックの深さに エクスポートすることを仮定しているので、ラッパは、非常に 注意して実装されない限り、関数がエクスポートされる場所を 変更します。 これは非常に扱いにくいです。

従って、私たちはこのような状況を手助けすることを意図した、 %{^HOOK} と呼ばれる新しいハッシュを導入しました。 あるキーワードが特殊フックに対応すると、 フックはこの新しいハッシュの中で有効になります。 このハッシュのフックは、これらが呼ぶ関数の名前、 二つの下線、それが実行されるフェーズ(現在は "before" か "after") からなる名前がつきます。

この初期リリースでは、二つのフック require__beforerequire__after に対応しています。 これらは、require 文の前後で処理を実行するのを容易にします。

さらなる詳細については perlvar を参照してください。

PERL_RAND_SEED

srand() を使わずに rand を使ったり、引数なしの srand() を 使う perl プログラムを再現可能にするために使われる、 新しい環境変数 PERL_RAND_SEED が追加されました。 perlrun を参照してください。 この機能はコンパイル時に無効にできます; 次のものを:

    -Accflags=-DNO_PERL_RAND_SEED

ビルド中に Configure に渡します。

シグネチャのデフォルト式の定義性論理和と論理和

サブルーチンシグネチャ引数のデフォルト式は、 単に引数が完全に省略されるのではなく、 呼び出し元が未定義値は偽の値を指定したときのデフォルトを適用するために、 (それぞれ) //=||= の演算子を使って代入できるようになりました。 さらなる詳細については perlsub の文書を参照してください。

@INC フック拡張と $INC と INCDIR

@INC フックの内部は、さまざまなエッジケースを扱うために強化され、 また、フックが require 操作の間に @INC を修正しても セグメンテーションフォルトや例外を発生させなくなりました。 この一部として、全ての指定されたフックは require 呼び出しの間に 最大 1 回しか実行されなくなり、重複したディレクトリが 追加のディレクトリ検査を引き起こさなくなりました。

開発者が動的なモジュール検索をさらに制御できるように、 新しいフックメソッド INCDIR に対応しました。 このメソッドに対応しているオブジェクトは @INC 配列に注入でき、 モジュール検索プロセスに遭遇したとき、INC フックが実行されるのと 同様に実行されます。 その返り値はモジュールを検索するためのディレクトリのリストとして使われます。 空リストを返すと、何もしません。 このフックによって返されるリファレンスは文字列化されて文字列として 使われるので、この API 経由で後で実行されるフックを 返してはいけないことに注意してください。

require の間に @INC フック (INCINCDIR のどちらか) が 呼び出されると、$INC 変数は、 フックが来た @INC の添え字の値にローカル化されます。 フックが @INC の「次の」添え字に来るものを上書きしたい場合、 $INC を目的の添え字から 1 を引いたものに更新できます (undef-1 と等価です)。 これにより @INC フックは、完全に @INC 配列を書き換えて、 perl に @INC の先頭からディレクトリ検索を再出発させるように することができます。

INCINCDIR メソッドに対応していない @INC の中の bless された CODE は、もはや例外を引き起こさず、 bless されていないコードリファレンスと同じように扱いますが、 INC フックとして実行されます。

deferfinally から離れる禁止された制御フローはコンパイル時に検出されるようになりました

return or goto のような制御フローで deferfinally ブロックから離れようとすることは許されていません。 以前のバージョンの perl では、実際に実行時に試みた時点でのみ これを検出できました。

このバージョンの perl では、静的に決定できる多くの場合での コンパイル時検出が追加されました。 これは、以前のバージョンの perl でコンパイルに成功していたコードが、 このバージョンではコンパイル時エラーとして 報告されるかもしれないということです。 これは、どちらにしろ実際にコードを実行したときにエラーになる場合にのみ 起こります; エラーは単に早く起きるだけです。

パターン中の楽観的評価

パターン中の (?{ ... })(??{ ... }) を使うと、 このパターン全体での様々な最適化を無効にします。 これはプログラマが望んたことかもしれませんし違うかもしれません。 このリリースでは等価な (*{ ... }) が追加されました。 唯一の違いは、正規表現エンジンの最適化が決して無効化されないことです。 将来呼び出される回数が増えたり減ったりするかもしれないという意味では より不安定になるかもしれませんが、 実行される回数は正規表現エンジンが動作する回数と正確に一致します。 例えば、ある種の最適化は、(?{ ... }) がパターンに含まれているときに 無効化されるので、通常の使用では O(N) のパターンが、 (?{ ... }) パターンを含むと O(N*N) になります。 (*{ ... }) に切り替えると、パターンは O(N) のままになります。

REG_INF は 65,536 から 2,147,483,647 に増やされました

以前は、多くの正規表現量指定子は U16_MAX に制限されていましたが、 制限は I32_MAX になりました; 従って、例えば /(?:word){1000000}/ と書けるようになりました。 こうすると正規表現エンジンの実行時間が長くなり、消費メモリが 増えることに注意してください。

新しい API 関数 optimize_optree と finalize_optree

(カスタム LOGOP を作成するときなど) 通常起動されないかもしれない、 op 木生成処理の必要な部分を確実に起動する、 op 木要素を操作するための二つの新しい API 関数があります。 これらの関数にアクセスするためには、まずこれらの関数を使うことを オプトインするための #define を設定する必要があります。

  #define PERL_USE_VOLATILE_API

これらの関数は、インタプリタがどのように動作するかの内部に 強く結びついていて、必要に応じて内部が変更されたときにいつでも 変更または削除される可能性があります。

deferfinally ブロックの中の一部の goto が許されるようになりました

Perl バージョン 5.36.0 は defer ブロックが追加され、 また try/catch 構文と似たような振る舞いをする finally キーワードも追加されました。 これらはブロック内でのあらゆる goto 式が許されていませんでした; ブロックから飛び出す制御フローになるかもしれないからです。 今回、固定のターゲットラベルを持ち、そのラベルがブロックの中にあるなら、 一部の goto 式は許されるようになりました。

  use feature 'defer';

  defer {
    goto LABEL;
    print "This does not execute\n";
    LABEL: print "This does\n";
  }

新しい正規表現変数 ${^LAST_SUCCESSFUL_PATTERN}

これは、現在のスコープで最後にマッチングに成功したパターンに アクセスできるようにします。 正規表現の多くの要素は「最後に成功したパターン」を参照します。 空パターンはこれを再利用し、全てのマジカル正規表現変数は これに関わります。 これはこのパターンにアクセスできるようにします。 以下のコードは:

    if (m/foo/ || m/bar/) {
        s//PQR/;
    }

次のように書き直せます:

    if (m/foo/ || m/bar/) {
        s/${^LAST_SUCCESSFUL_PATTERN}/PQR/;
    }

そしてこれは正確に同じ事です。

ロケールカテゴリ LC_NAME は、参加しているプラットフォームで対応するようになりました

GNU 拡張の LC_NAME カテゴリがあるプラットフォームでは、 このロケールを設定あるいは問い合わせするための "setlocale" in POSIX のカテゴリ引数として、これを使えるようになりました。

互換性のない変更

readline() はもはやストリームエラーと eof フラグをクリアしなくなりました

readline() (<> とも書けます) は、ストリームに対してエラーが 発生した後、ハンドルのエラーと eof フラグをクリアしていました。

ほぼ全ての場合で、このクリアはもはや行われないので、 エラーと eof フラグは readline() の後のストリームの状態を 適切に反映するようになりました。

エラーフラグは、失敗するかも知れない、明示的に閉じられていない ストリームに対する close() の呼び出しでもはや クリアされないので、ストリームを暗黙に閉じると 警告が出るかもしれません。

これは下流の CPAN モジュールに 2 種類の問題を引き起こし、 これらはあなたのコードにも起きるかもしれません:

エラー時にエラーと eof フラグがクリアされる唯一の場合は、 miniperl の glob() のための子プロセスから読み込む場合です。 これにより、close() 時の子プロセスからのエラーを正しく報告できます。 これが通常の perl 開発の間に問題になることは考えにくいです。

[GH #20060]

INIT ブロックはもはや BEGIN 内の exit() の後で実行されなくなりました

INIT ブロックはもはや、 BEGIN の内側の exit() の処理後に実行されなくなりました。 つまり、-v オプションと -c オプションの組み合わせで、もはや perl バージョンの表示しながらコンパイルチェックを実行しなくなりました。 -v オプションは BEGIN ブロックの中でバージョンを表示した後 exit(0) を実行し、-c のチェックは INIT フックを使って 実装されているので、-v オプションが優先されます。

[GH #1537] [GH #20181]

文法エラーはもはや「幽霊エラーメッセージ」を生成しなくなりました

一般的には、perl はコンパイルエラーに遭遇した後もソースコードのパースを 続けます。 多くの場合、例えば変数名のスペルミスのような場合は、 できるだけ多くのエラーを表示するのは助けになります。 しかし、文法エラーの場合、続けるとおかしなエラーメッセージが出たり、 コンパイル中にセグメンテーションフォルトを引き起こすことすらあります。 このリリースでは、コンパイラは最初に文法エラーに遭遇した時点で停止します。 これは、特定のエラーメッセージが出力されることを想定したコードは 壊れるということです。 出力されるエラーは、今まで出力されていた診断メッセージの一つです。 場合によっては、今まで出力されていた一部のメッセージは もはや表示されません。

さらなる詳細については "Changes to Existing Diagnostics" を 参照してください。

utf8::upgrade()

このリリースから、入力文字列が undef の場合、 undef のままになりました。 以前は、定義された、長さ 0 の文字列に変更していました。

「スレッドセーフ」ロケールの変更

Perl 5.28 は、特に最近の Windows と、POSIX 2008 ロケール操作に 対応しているシステムのような、対応しているシステムで 「スレッドセーフ」ロケールを導入しました。 これらのシステムは、スレッド単位のロケールを持つことでこれを 達成している一方、新しいスレッド単位のロケールを 使うのに必要な手順を取っていないコードのために 古いグローバルならロケール操作も対応し続けています。

一部の POSIX 2008 プラットフォームは実装にバグがあります、あるいは ありました; これにより perl はこれを使わないように強制しています。 ${^SAFE_LOCALES} スカラ変数は、現在のプラットフォームが動作する スレッドセーフ実装を持っていると perl が考えているかどうかを示す 0 または 1 を取ります。 一部の実装はすでに修正されていますが、 FreeBSD と Cygwin は、このリリースから perl がもはや使っていない スレッドセーフ操作に新たにバグが発見されました。 従って、それらについては ${^SAFE_LOCALES} は 0 になりました。 古いバージョンの perl は、 Configure オプション -DNO_POSIX_2008_LOCALE を追加することで これらのバグのある実装を避けるように設定できます。

そして、v5.38 では、以前の全ての perl が持っていた、 ロケールが完全にスレッドセーフではなくなるバグを修正しました。 終了した最初のスレッドは、 (thread0 という名前の)メインスレッドを 以前に設定したスレッドのロケールを捨てて、 起動時に有効だったグローバルなロケールに巻き戻します。 その他のスレッドが XS コードの中で switch_to_global_locale() を 呼び出すことでグローバルなロケールに切り替えると、 これらのスレッドは全てグローバルロケールを共有し、 thread0 はスレッドセーフではありません。

廃止予定

パッケージ名区切りとしての ' の使用は廃止予定になりました

ダブルクォート文字列の中で変数名のパッケージ区切り文字に ' を使うことは、5.28 から警告が出ていました。 これは、文字列変数展開と非変数展開コンテキストの両方で廃止予定になり、 Perl 5.42 に削除される予定です。

switch とスマートマッチング演算子

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

v5.38.0 で、私達はこの実験が失敗であると宣言しました。 何らかの将来のシステムがスマートマッチングの概念的な代わりと なるかもしれませんが、まだ設計されたりビルドされたりはしていません。

これらの機能は、v5.42.0 に perl から完全に削除される予定です。

性能改善

モジュールとプラグマ

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

文書

新しい文書

perlclass

新しい class 機能を記述しています。

perlclassguts

新しい class 機能の内部を記述しています。

既存の文書の変更

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

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

perlapi

perldeprecation

perlintern

perlexperiment

perlfunc

perlhacktips

perlop

perlvar

診断メッセージ

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

新しい警告メッセージ

新しいエラー

新しい警告

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

設定とコンパイル

テスト

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

プラットフォーム対応

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

Ultrix

DEC Ultrix のための対応コードが削除されました。 Ultrix は、様々な Digital Equipment Corporation マシンのための ネイティブな Unix 風のオペレーティングシステムです。 この最後のリリースは 1995 年でした。

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

DragonflyBSD

setproctitle() の明らかなバグを回避するためにテストをスキップします。 [GH #19894]

FreeBSD

FreeBSD は、 FreeBSD のバグ を 回避するために、スレッドセーフなロケール操作を使わなくなりました。

archname の最初の部分を `uname -p` で置き換えました [GH #19791]

Solaris

NetBSD/Solaris での regexec.c と regcomp.c の 一部のコンパイラとコンパイル時の問題を起きないようにしました。

Synology

DSM 7 のために Synology Readme を更新しました。

Windows

vmem.h からの gcc-12 のために必要な win32 メモリアライメントを 修正しました。

Win32 の utimes() は、 指定された time_t から FILETIME への変換に失敗したときに、 stderr にメッセージを出力していました。. [GH #19668]

場合によっては、stat()lstat() によって返されるタイムスタンプは、 夏時間を考慮に入れるのに失敗していました。 [GH #20018] [GH #20061]

stat() は AF_UNIX ソケットファイルで動作するようになりました。 [GH #20204]

readlink() は、 シンボリックリンク再パースポイントから SubstituteName ではなく PrintName を返すようになりました; これにより、リンクが作られた名前とよりよく一致するようになります。 [GH #20271]

Windows での lstat() は、POSIX システムと同様、 ファイルサイズとしてリンクターゲットの長さを返すようになりました。 [GH #20476]

Windows での symlink() は、ターゲット中の全ての /\ で置き換えます; Windows はシンボリックリンク中の / を認識しないからです。 逆変換は readlink() によって 行われません 。 [GH #20506]

ディレクトリへの絶対パスがターゲットの symlink() は、 誤ってファイルのシンボリックリンクを作成していました。 [GH #20533]

POSIX::dup2 はもはや壊れたソケットを作らなくなりました。 [GH #20920]

ビジー状態のパイプを閉じると Perl のハングアップを 引き起こすことがありました。 [GH #19963]

内部の変更

バグ修正の抜粋

謝辞

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

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

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

Alex, Alexander Nikolov, Alex Davies, Andreas König, Andrew Fresh, Andrew Ruthven, Andy Lester, Aristotle Pagaltzis, Arne Johannessen, A. Sinan Unur, Bartosz Jarzyna, Bart Van Assche, Benjamin Smith, Bram, Branislav Zahradník, Brian Greenfield, Bruce Gray, Chad Granum, Chris 'BinGOs' Williams, chromatic, Clemens Wasser, Craig A. Berry, Dagfinn Ilmari Mannsåker, Dan Book, danielnachun, Dan Jacobson, Dan Kogai, David Cantrell, David Golden, David Mitchell, E. Choroba, Ed J, Ed Sabol, Elvin Aslanov, Eric Herman, Felipe Gasper, Ferenc Erki, Firas Khalil Khana, Florian Weimer, Graham Knop, Håkon Hægland, Harald Jörg, H.Merijn Brand, Hugo van der Sanden, James E Keenan, James Raspass, jkahrman, Joe McMahon, Johan Vromans, Jonathan Stowe, Jon Gentle, Karen Etheridge, Karl Williamson, Kenichi Ishigaki, Kenneth Ölwing, Kurt Fitzner, Leon Timmermans, Li Linjie, Loren Merritt, Lukas Mai, Marcel Telka, Mark Jason Dominus, Mark Shelor, Matthew Horsfall, Matthew O. Persico, Mattia Barbon, Max Maischein, Mohammad S Anwar, Nathan Mills, Neil Bowers, Nicholas Clark, Nicolas Mendoza, Nicolas R, Paul Evans, Paul Marquess, Peter John Acklam, Peter Levine, Philippe Bruhat (BooK), Reini Urban, Renee Baecker, Ricardo Signes, Richard Leach, Russ Allbery, Scott Baker, Sevan Janiyan, Sidney Markowitz, Sisyphus, Steve Hay, TAKAI Kousuke, Todd Rinaldo, Tomasz Konojacki, Tom Stellard, Tony Cook, Tsuyoshi Watanabe, Unicode Consortium, vsfos, Yves Orton, Zakariyya Mughal, 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 ファイル。