perl5400delta - perl v5.40.0 での変更点
この文書は 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
関数 (実験的)二つの新しい関数、inf
と nan
が builtin
名前空間に追加されました。 これらは、それぞれ浮動小数点数の無限大と非数値を生成する定数のように動作します。
^^
排他的論理和演算子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 のバージョンの束 を インポートします。
この脆弱性は、Nathan Mills the.true.nathan.mills@gmail.com
によって Perl セキュリティチームに直接報告されました。
巧妙に細工された正規表現を perl 5.30.0 から 5.38.0 でコンパイルすると、 ヒープに割り当てられたバッファで、攻撃者が制御する 1 バイトの バッファオーバーフローが発生する可能性があります。
この脆弱性は、 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.exe
を C:\ProgramData
などの弱い権限を 持つ場所に配置することで、この動作を不正利用できる可能性があります。 これにより、管理者がこれらの侵害された場所からこの実行可能ファイルを 使用しようとしたときに、任意のコードが実行される可能性があります。
以前の reset EXPR
では、スカラ変数をクリアするときに set magic を 呼び出しませんでした。 これは、変更が $^W
などの必要な場所で基礎となる内部状態に伝播されず、 $1
などの基礎となるマジックが通常例外を投げるような例外が発生しないことを 意味していました。
つまり、以前は何の効果もなかったコードが、実際には効果を持つようになり、 例外を投げる可能性もあります。
reset EXPR
はすでに、配列とハッシュを変更するときに set magic を 呼び出しています。
これは、m?pattern?
と同様に、一回のマッチング検索をリセットするために使われる 単純な reset
には影響しません。
歴史的には、定義されていないクラスも含めて、任意のクラスの import
または unimport
メソッドを引数付きで呼び出すことができ、エラーは 発生しませんでした。 たとえば、次のコードは Perl 5.38 ではエラーを投げません。
Class::That::Does::Not::Exist->import("foo");
しかし、Perl 5.39.1 からこれは廃止予定になり、警告が起こります。 引数なしでこれらのメソッドを呼び出しても、暗黙に成功し、 何もしないままであることに注意してください。 例えば:
Class::That::Does::Not::Exist->import();
これはエラーを投げません。 これは、全てのクラスが暗黙にクラス UNIVERSAL から継承しており、クラス UNIVERSAL が import
メソッドを定義しているためです。 以前の perl ではそのようなメソッドは定義されておらず、代わりに import
と unimport
のメソッド呼び出しは、そのようなメソッドが定義されていない場合に エラーを投げないように特別扱いされていました。
この変更が追加されたのは、大文字小文字を区別しないファイルシステムで 実行するときに、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
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;
goto
を使って外部スコープから内部スコープにジャンプすることは 廃止予定で、Perl 5.42 では完全に削除される予定です。 [GH #21601]
否定 OP は、一般的な TARGMY
最適化に対応するように修正されました。 [GH #21442]
Term::Table 0.018 が Perl コアに追加されました。
このモジュールは、Test2::Suite の依存関係です。
Test2::Suite 0.000162 が Perl コアに追加されました。
この配布には、単体テストを作るための包括的なテストツールの集合が 含まれています。 これは、Test::More および同様のモジュールの後継です。 Perl コアに含まれているため、CPAN モジュールテストは、追加の依存関係なしに このツールスイートを使って作成できます。
Archive::Tar はバージョン 2.40 から 3.02_001 に更新されました。
attributes はバージョン 0.35 から 0.36 に更新されました。
autodie はバージョン 2.36 から 2.37 に更新されました。
B はバージョン 1.88 から 1.89 に更新されました。
B::Deparse はバージョン 1.74 から 1.76 に更新されました。
Benchmark はバージョン 1.24 から 1.25 に更新されました。
bignum はバージョン 0.66 から 0.67 に更新されました。
builtin はバージョン 0.008 から 0.014 に更新されました。
builtin は、入力引数としてバージョンバンドルを受け入れ、指定された Perl バージョンでモジュールの安定した部分と見なされる全ての関数を インポートするよう要求します。 例えば:
use builtin ':5.40';
PPC 0006 に 従って、load_module()
組み込み関数が追加されました。
bytes はバージョン 1.08 から 1.09 に更新されました。
Compress::Raw::Bzip2 はバージョン 2.204_001 から 2.212 に更新されました。
Compress::Raw::Zlib はバージョン 2.204_001 から 2.212 に更新されました。
CPAN::Meta::Requirements はバージョン 2.140 から 2.143 に更新されました。
Data::Dumper はバージョン 2.188 から 2.189 に更新されました。
DB_File はバージョン 1.858 から 1.859 に更新されました。
Devel::Peek はバージョン 1.33 から 1.34 に更新されました。
Devel::PPPort はバージョン 3.71 から 3.72 に更新されました。
diagnostics はバージョン 1.39 から 1.40 に更新されました。
DynaLoader はバージョン 1.54 から 1.56 に更新されました。
Encode はバージョン 3.19 から 3.21 に更新されました。
Errno はバージョン 1.37 から 1.38 に更新されました。
モジュールを構築した perl によって Errno が確実にロードされるように モジュールに組み込まれた osvers
と archname
が、より包括的に エスケープされるようになりました。 [GH #21135]
experimental はバージョン 0.031 から 0.032 に更新されました。
Exporter はバージョン 5.77 から 5.78 に更新されました。
ExtUtils::CBuilder はバージョン 0.280238 から 0.280240 に更新されました。
ExtUtils::Manifest はバージョン 1.73 から 1.75 に更新されました。
ExtUtils::Miniperl はバージョン 1.13 から 1.14 に更新されました。
Fcntl はバージョン 1.15 から 1.18 に更新されました。
古いモジュール文書のスタブが大幅に拡張され、改訂されました。
Linux での O_TMPFILE
フラグの対応が追加されました。
feature はバージョン 1.82 から 1.89 に更新されました。
:all
機能の束について文書化し、この束を使いたくないかもしれない 理由を示します。
fields はバージョン 2.24 から 2.25 に更新されました。
File::Compare はバージョン 1.1007 から 1.1008 に更新されました。
File::Find はバージョン 1.43 から 1.44 に更新されました。
File::Glob はバージョン 1.40 から 1.42 に更新されました。
File::Spec はバージョン 3.89 から 3.90 に更新されました。
File::stat はバージョン 1.13 から 1.14 に更新されました。
FindBin はバージョン 1.53 から 1.54 に更新されました。
Getopt::Long はバージョン 2.54 から 2.57 に更新されました。
Getopt::Std はバージョン 1.13 から 1.14 に更新されました。
文書とテストの改善のみ; 機能の変更はありません。
Hash::Util はバージョン 0.30 から 0.32 に更新されました。
Hash::Util::FieldHash はバージョン 1.26 から 1.27 に更新されました。
HTTP::Tiny はバージョン 0.086 から 0.088 に更新されました。
I18N::Langinfo はバージョン 0.22 から 0.24 に更新されました。
POSIX 標準で定義されている以外に、Linux が定義する追加の ロケールカテゴリを扱うようになりました。
これにより、ALT_DIGITS
項目に返される内容が修正されます; これは、これまで Perl では正しく動作していませんでした。
IO はバージョン 1.52 から 1.55 に更新されました。
IO 1.32 以降機能しなくなっていた Windows の IO::Handle/blocking
が修正されました。 [GH #17455]
IO-Compress はバージョン 2.204 から 2.212 に更新されました。
IO::Socket::IP はバージョン 0.41_01 から 0.42 に更新されました。
IO::Zlib はバージョン 1.14 から 1.15 に更新されました。
locale はバージョン 1.10 から 1.12 に更新されました。
Math::BigInt はバージョン 1.999837 から 2.003002 に更新されました。
Math::BigInt::FastCalc はバージョン 0.5013 から 0.5018 に更新されました。
Module::CoreList はバージョン 5.20230520 から 5.20240609 に更新されました。
Module::Metadata はバージョン 1.000037 から 1.000038 に更新されました。
mro はバージョン 1.28 から 1.29 に更新されました。
NDBM_File はバージョン 1.16 から 1.17 に更新されました。
Opcode はバージョン 1.64 から 1.65 に更新されました。
perl5db.pl はバージョン 1.77 から 1.78 に更新されました。
l
コマンド引数のパースをよりまともにしました。 [GH #21350]
perlfaq はバージョン 5.20210520 から 5.20240218 に更新されました。
PerlIO::encoding はバージョン 0.30 から 0.31 に更新されました。
PerlIO::scalar はバージョン 0.31 から 0.32 に更新されました。
PerlIO::via はバージョン 0.18 から 0.19 に更新されました。
Pod::Checker はバージョン 1.75 から 1.77 に更新されました。
Pod::Html はバージョン 1.34 から 1.35 に更新されました。
Pod::Simple はバージョン 3.43 から 3.45 に更新されました。
podlators はバージョン 5.01 から 5.01_02 に更新されました。
POSIX はバージョン 2.13 から 2.20 に更新されました。
mktime
関数は、プラットフォームの time_t
型が 32 ビットより 大きい場合でも、32 ビットプラットフォームで正しく動作するようになりました。 [GH #21551]
T_SIGNO
と T_FD
の typemap エントリが修正され、ハードコードされた sig
と fd
だけでなく、任意の変数名で動作するようになりました。
Mode_t
, pid_t
, Uid_t
, Gid_t
, Time_t
のマッピングは、 整数型に更新されました; 以前は NV
浮動小数点型でした。
Oracle Developer Studio のコンパイラによって NaN に対して返される異常な ビットパターンを扱うために、NaN テストの signbit() が調整されました。 [GH #21533]
re はバージョン 0.44 から 0.47 に更新されました。
Safe はバージョン 2.44 から 2.46 に更新されました。
SelfLoader はバージョン 1.26 から 1.27 に更新されました。
Socket はバージョン 2.036 から 2.038 に更新されました。
strict はバージョン 1.12 から 1.13 に更新されました。
Test::Harness はバージョン 3.44 から 3.48 に更新されました。
Test::Simple はバージョン 1.302194 から 1.302199 に更新されました。
Text::Tabs はバージョン 2021.0814 から 2024.001 に更新されました。
Text::Wrap はバージョン 2021.0814 から 2024.001 に更新されました。
threads はバージョン 2.36 から 2.40 に更新されました。
内部エラーがもう少し詳しくなりました (Out of memory in perl:threads:ithread_create
)。
threads::shared はバージョン 1.68 から 1.69 に更新されました。
Tie::File はバージョン 1.07 から 1.09 に更新されました。
もはや機能しない perl 5.005 の古い互換コードは削除されました。
Time::gmtime はバージョン 1.04 から 1.05 に更新されました。
Time::HiRes はバージョン 1.9775 から 1.9777 に更新されました。
Time::Local はバージョン 1.30 から 1.35 に更新されました。
Time::localtime はバージョン 1.03 から 1.04 に更新されました。
Time::tm はバージョン 1.00 から 1.01 に更新されました。
UNIVERSAL はバージョン 1.15 から 1.17 に更新されました。
User::grent はバージョン 1.04 から 1.05 に更新されました。
User::pwent はバージョン 1.02 から 1.03 に更新されました。
version はバージョン 0.9929 から 0.9930 に更新されました。
warnings はバージョン 1.65 から 1.69 に更新されました。
XS::APItest はバージョン 1.32 から 1.36 に更新されました。
XS::Typemap はバージョン 0.19 から 0.20 に更新されました。
私たちはこの文書で挙げられた変更を反映するように文書を更新しようとしています。 もし抜けている物を発見したら、 https://github.com/Perl/perl5/issues でイシューを開いてください。
それに加えて、以下のような変更が行われました。
Perl_form
, form_nocontext
, vform
の文書を 修正しました; これらのいずれかを後で呼び出すと、いずれかからの以前の 返り値が破棄されると主張していました。 これは 5.6.0 以降は真実ではありません; 但しこれらがグローバル破壊中に 呼び出された場合は真実のままです。 この点に注意してください; これらのそれぞれの返り値は、"FREETMPS
" in perlapi への呼び出しによって、 または文境界などの場所で自動的に解放される一時的な新しい文字列です。
さまざまな newSUB
関数、newANONLIST()
, newANONHASH()
, newSVREF()
など、いくつかの内部関数に文書が追加されました。
実験的な class
機能での既知のバグの一覧が追加されました。
実験的な、参照カウントされる引数スタックのビルドオプション (PERL_RC_STACK
) を記述する新しい節が追加されました。
より多くの避けるべき関数や、ロケールとスレッドとの付き合い方といった、 標準 C ライブラリとの接続に関する幅広いガイドが追加されました。
C++ の互換性のため、複合リテラルや配列指定子は使えないことを文書化しました。 [GH #21073]
新しい関数 sv_mark_arenas()
と sv_sweep_arenas()
(これらは DEBUGGING
ビルドにのみ存在します)を文書化しました。
Windows や Cygwin 上で perl 自身を開発する際に役立ついくつかのツールの 簡単な説明を追加しました。
Dumpvalue
の例から間接オブジェクト構文が削除されました。
/p
が何もしないことを示唆する文が削除されました。
(refaliasing
機能の一部としての)リストコンテキスト内のリファレンス代入を 文書化しました。
空のパターン //
の節が修正され、現在の動的スコープが最後の成功した マッチングを見つけるために使われることに言及しました。
-S
のファイルテストは、5.37.6 から Win32 で有効になっています。
-l
ファイルテストが Win32 で有効になりました。
Windows で名前の最後に .
を使ったときの奇妙な振る舞いについて 文書化されました。
${^CAPTURE}
の代替に関する文書が追加されました。
次のような追加と変更が、警告や致命的エラーメッセージを含む診断出力に 行われました。 診断メッセージの完全な一覧については、perldiag を参照してください。
Cannot use __CLASS__ outside of a method or field initializer expression
(F) __CLASS__
式は、現在のメソッドを実行するオブジェクトインスタンスの クラス名を生成するので、実際のメソッド(または、フィールド初期化式などの メソッド風の式)の中にのみ配置できます。
get_layers: unknown argument '%s'
(F) あなたは未知の引数 でPerlIO::get_layers() を呼び出しました。 有効な引数はキーと値のペアで提供され、キーは input
, output
, detail
のいずれかで、その後に真偽値が続きます。
UNIVERSAL does not export anything
(F) UNIVERSAL に何かをエクスポートするように要求しましたが、 UNIVERSAL はすべてのクラスの基底クラスであり、 エクスポート可能なシンボルを含んでいません。
Builtin version bundle "%s" is not supported by Perl
(F) バージョン番号が 5.39 (機能が追加されたとき)より古いか、 現在の perl バージョンより新しいバージョン番号に対して use builtin :ver
を実行しようとしました。
(F) use builtin ...
文中にインポートバンドルを指定するために 使われるバージョン番号は、:MAJOR.MINOR
として フォーマットしなければなりません。 オプションの 3 番目のコンポーネントは無視されます。 各コンポーネントは 1 から 3 桁の数字でなければなりません。 他の文字は使えません。 指定された値はこれらの規則に従っていません。
Missing comma after first argument to return
(F) 特定の演算子では、引数リストの前にファイルハンドルまたは 「間接オブジェクト」を指定できますが、return
はその一つではありません。
Out of memory during vec in lvalue context
(F) 大きな 2 番目の引数で呼び出された vec()
に代入することによって、 可能な最大のメモリ割り当てを超えて文字列を拡張しようとしました。
(このケースでは、以前は一般的な Out of memory!
エラーが投げられていました。)
Cannot create an object of incomplete class "%s"
(F) クラス定義の開始が確認されたクラスのオブジェクトを作成しようとしましたが、 クラスが完了していません。
これは、失敗した eval、またはクラスが完了する前のコンパイル時にオブジェクトを 作成しようとした場合に発生する可能性があります。
eval "class Foo {"; Foo->new; # error
class Bar { BEGIN { Bar->new } }; # error
これまでの perl はアサートやクラッシュを起こしていました。 [GH #22159]
Forked open '%s' not meaningful in <>
(S inplace) @ARGV
に |-
または -|
があり、<>
を使って それを読み取ろうとしました。
これまでは、これが分岐して紛らわしいエラーメッセージが表示されていました。 [GH #21176]
(D deprecated::missing_import_called_with_args) 継承グラフに インポートメソッドが定義されていないクラスの import()
または unimport()
メソッドを呼び出し、そのメソッドに引数を渡しました。 これは多くの場合、use 文または require 文の中で、大文字と小文字を区別しない ファイルシステムのために暗黙的に成功したパッケージ名のスペルミスの兆候です。
これが発生するもう一つの一般的な理由は、Exporter
を使わないか、 独自の import
または unimport
メソッドを定義していないクラス定義または パッケージから、誤ってシンボルをインポートまたは インポート解除しようとした場合です。
Name "%s::%s" used only once: possible typo
この警告は致命的とマークされるようになりました。 [GH #13814]
Perl コアには以前、一般的な Out of memory!
メッセージを出力して、 メモリ割り当てが失敗したときにメモリを使い果たしたプログラムを表示せずに 中断する場所がいくつかありました。 これらは、perl
という語と割り当て失敗の一般的な領域を含むように 修正されました; 例えば、Out of memory in perl:util:safesysrealloc
。 [GH #21672]
Possible precedence issue with control flow operator (%s)
この警告では、診断を引き起こした制御フロー演算子の名前 (return
, exit
, die
など)が示されるようになりました。
また、より多くの状況に対応するようになりました: これまでは、(and
, or
, xor
のような)優先順位の低い論理演算子が 含まれている場合にのみ警告が発生していました。 次のような誤解を招くコードにも表示されるようになりました:
exit $x ? 0 : 1; # actually parses as: exit($x) ? 0 : 1;
exit $x == 0; # actually parses as: exit($x) == 0;
この警告は、length
, pop
, shift
, splice
に関する場合に、 さらに若干正確になりました:
my $x;
length($x) == 0
# Before:
# Use of uninitialized value $x in numeric eq (==) at ...
# Now:
# Use of uninitialized value length($x) in numeric eq (==) at ...
つまり、この警告は、$x
が ==
のオペランドとして直接使われたことを 意味するものではもはやなくなりました。
同様に:
my @xs;
shift @xs == 0
# Before:
# Use of uninitialized value within @xs in numeric eq (==) at ...
# Now:
# Use of uninitialized value shift(@xs) in numeric eq (==) at ...
以前の警告が暗示していたように @xs
の中身が undef
である 訳ではないので、これはより正確です。 (pop
の警告も同様に動作します。)
最後に:
my @xs = (1, 2, 3);
splice(@xs, 0, 0) == 0
# Before:
# Use of uninitialized value within @xs in numeric eq (==) at ...
# Now:
# Use of uninitialized value in numeric eq (==) at ...
つまり、splice
が undef
を返す場合、 もはや最初の引数を無条件に非難しなくなりました。 splice
は、その引数に undef
が含まれていなくても undef
を 返すことがあるため、これは誤解を招くものでした。
Old package separator "'" deprecated
You need to quote "%s" 警告のための ヒューリスティックをチェックするときに、この警告が誤って 表示されないようになりました。
Perl 5.18 で約束されたように、 長い間壊れていて現在の目的が不明確な microperl
は削除されました。
5.39.2 で導入された、異なるロケールのための LC_ALL
構文を 調べるためのコードのために使われていた日やドキュメントが修正されました。 [GH #21451]
-Accflags=-DPERL_USE_HWM
または -Accflags=-DPERL_NO_HWM
を使った、 非 DEBUGGING ビルドの High Watermark チェックを個別に有効または 無効にできるようになりました。 デフォルトは同じです。 [GH #16607]
このリリースのその他の追加と変更を反映してテストが追加、変更されました。 さらに、主に以下のような変更が行われました:
Darwin での nm の出力の変更を扱うために、 t/porting/libperl.t 内の Darwin のための nm の出力のパースを更新しました。 [GH #21117]
ps
が BusyBox の実装である場合、t/op/magic.t は失敗します。 これは、-p
フラグに対応しておらず、コマンドライン上のプロセス ID が 無視されるためです。 これにより、Alpine Linux などの BusyBox システムで TEST エラーを 引き起こししていました。 [GH #17542]
porting/globvar.t は、オブジェクトファイルで定義された名前を フェッチするために、より移植性の高い nm -P ...
を 使うようになりました。 オブジェクト内で見つかった名前の解析は、AIX 上のローカル定義と グローバル定義の間の重複を扱うための処理から分離されました。 [GH #21637]
lib/locale_threads.t に、 ロケールの扱いを詳細にテストするテストが追加されました。 Linux, Windows, Darwin などの *BSD 派生物など、さまざまな プラットフォームでの libc 実装には、この点に関してバグがあることが 判明しています。 このテストの実験版は、過去数年間、Perl 実装とそれらの プラットフォームのバグを発見するため、 また、可能な場合には、プラットフォームのバグに対する Perl 実装の 回避策を開発するために使われてきました。 プラットフォームに対して複数のバグレポートチケットが提出され、 いくつかが修正されています。 このテストでは、スレッドセーフなロケール処理をサポートすることを意図した プラットフォームが実際にそうしていることを チェックします(また、スレッドセーフなロケール処理をサポートしている プラットフォームで perl が正しく動作することもチェックします; プラットフォームの文書にどのように記されているかに関わらず、 perl がプラットフォームがこれを処理できると判断した場合は、 読み取り専用変数 ${^SAFE_LOCALES}
が 1 に設定されます)。
また、さまざまなロケールカテゴリが、実際に異なるロケールに対して独立して 設定できるかどうかもテストされます(これがほしいと思われる一つの例として、 あなたがオランダに住んで働いている西カナダ人とします。 LC_MONETARY
ロケールを現在住んでいる場所に設定し、 ロケールの他の部分はネイティブの英語の値を保持することができます。 その後、オランダ語に少し慣れてきて、同僚とのコミュニケーションを 良くするために、LC_TIME
と LC_NUMERIC
をオランダ語に変更し、 LC_CTYPE
と LC_COLLATE
を無期限に 英語に設定したままにすることができます)。
テスト t/porting/libperl.t は、メンテナンスリリースでは もはや実行されません。 このテストは、さまざまなプラットフォームでの nm の出力の変化に 敏感であり、blead でこのテストを更新しても tarball は更新されません。 [GH #21677]
すぐに使える Serenity OS 対応が追加されました。
/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]
ヒントファイルが更新され、Intel oneAPI DPC++/C++ コンパイラを 扱えるようになりました。
Mac OSX 10.5 上でビルドする場合は、MACOSX_DEPLOYMENT_TARGET
を 設定しなくなりました。 [GH #21367]
configure の "installation prefix" プロンプトが、yes/no ではなく文字列を 受け入れるように修正されました。
perl_lc_all_category_positions_init
に適切な値を定義することで、 コンパイルが修正されました。
config_H.SH を読み込む際のバッファサイズを増やし、clang の下での コンパイルを修正しました。
明らかなコード生成のバグにより、Oracle Developer Studio(以前の Sun Workshop)コンパイラのデフォルトの最適化レベルは -xO1
になりました。 [GH #21535]
PERL_RC_STACK
ビルドオプションが追加されました。
この新しいビルドオプションは非常に実験的なものであり、デフォルトでは 有効になっていません。 Configure オプション -Accflags='-DPERL_RC_STACK'
を使うことで、 このオプションを使って Perl をビルドできます。
これは、引数スタックにプッシュされた SV の参照カウントをバンプさせます。 ほとんどは機能しますが、現在は遅く不完全です。
長期的には、このビルドオプションがデフォルトオプションになり、 最終的には唯一のオプションになることが意図されています; しかしこれには多くのリリースがかかる予定です。
特に、現在 XS コード内でこれらの新機能を使うためのサポートがありません。 そのため、このビルドオプションの下では、すべての XS 関数は下位互換性のある ラッパーを介して呼び出されるため、そのような呼び出しが遅くなります。
将来のリリースでは、XS コードのサポートが強化される予定です。 単純な XS コードは、最終的には修正なしで参照カウントされたスタックを 利用できるようになり、重い処理は XS コンパイラ(xsubpp
)とそれが出力する マクロによって処理されることが期待されています。 しかし、PP() 関数を実装するコードは、最終的には新しい PP API を使うように 修正する必要があります: PUSHs() などではなく rpp_foo() です。 しかし、この新しい API はまだ安定しておらず、Devel::PPPort
を介して バックポートされてもいません。
さらなる詳細については、 perlguts を参照してください。
LISTOP
op 木要素を作る C(または XS)コードを簡略化する、新しい API 関数が追加されました。 newLISTOPn()
は、NULL
で終端された子 op ポインタのリストを取り、 それら全てを含む新しいチェック済み LISTOP
を構築する可変関数です。 これは、新しいプレーンな OP_LIST
を作成し、それぞれの子を個別に追加し、 最後にほとんどのコード要素で op_convert_list()
を呼び出すよりも より簡単です。
eval_sv()
API が G_USEHINTS
フラグを受け入れるようになりました; このフラグは、デフォルトではなく、PL_curcop
の strict や features などのヒントを使います; デフォルトでは、no use vX.XX;
, no strict, デフォルトの機能といった デフォルトのヒントを使います。
XS コードでこのフラグを使う場合は注意してください: 評価されたコードは、XS 関数が呼び出された時点で有効な strict 性や機能に 対応する必要があります。
PERL_VERSION_LE
が "less than" ではなく "less than or equal" を正しく チェックするように修正されました。
dAX
, dITEMS
, そして dXSARGS
は、AX
と items
を SSize_t
ではなく Stack_off_t
として宣言するようになりました。 これにより、Stack_off_t
が I32
である perl のデフォルトビルドに対する 64 ビット以前のスタックサポートとの互換性に戻ります。 [GH #21782]
XS
コードで "sv_langinfo" in perlapi という新しい関数が 利用可能になりました。 これは既存の "Perl_langinfo8" in perlapi と同じ情報を提供しますが、 char *
の代わりに SV を返すので、プログラマは結果の UTF-8 性を 気にする必要がありません。 この新しい関数は、XS
コードから nl_langinfo(3) libc
関数への 優先インタフェースになりました。 Perl 空間からは、この情報は引き続き I18N::Langinfo モジュールによって 提供されます。
glibc には文書化されていない querylocale() と同等の関数がありますが、 これは私たちの経験から信頼できることが示されています。 この関数を使うと、perl が独自の記録を保持する必要がなくなるため、 より効率的で正確であることが保証されます。 この関数の使用は、NO_NL_LOCALE_NAME
ビルドオプションを 定義することで無効にできます。
区切り文字 SYRIC C COLON SKEWED LEFT/RIGHT
の組は、 extra_paired_delimiters
機能で認識される組から削除されました ("Quote and Quote-like Operators" in perlop を参照)。 これは、これらの文字が通常右から左に書かれているため、視覚的に混乱する 可能性があるためです[GH #22228]。 この変更は、実際には右から左の区切り文字を禁止するためのものでしたが、 現在この基準を満たすのはこの組だけです。 ポリシー上、この変更は、extra_paired_delimiters
機能が実験的な状態を 終了するのに十分な期間安定していたとは考えられないことを意味します。
use 5.36;
以降では、警告を有効にしたときに、 Name "%s::%s" used only once: possible typo 警告の、パース後の報告が有効になっていませんでした。 [GH #21271]
外部の our
サブルーチンを参照するクロージャをクリーンアップするときの クラッシュやアサーションを修正しました。 [GH #21067]
SSize_t
または STRLEN
/size_t
ではなく、 I32
が文字列のオフセットまたはサイズとして使われる場合の 多くの問題が修正されました。 [GH #21012]
$str
のサイズが 2GB を超える場合、~$str
は何も実行しなかったり、 不完全な結果を生成したりしていました。
文字列の繰り返し $str x $count
は、サイズが 2GB を超える $str
を処理できず、エラーが投げられていました。 このような文字列は繰り返されるようになりました。
文字列内の 2GB よりの後の位置での複雑な置換は、文字列内の不正または 無効なオフセットにアクセスする可能性がありました。
sv_utf8_decode() は SV の pos() の値を切り捨てます。 これは utf8::decode() では見ることができませんでした。
定数折り畳みハッシュキーをコンパイルするとき、共有 SV の作成時に 長さが切り捨てられていました。 2GB を超えるハッシュキーには対応していないため、代わりに コンパイルエラーが投げられます。
msgrcv() がバッファ SV に誤って get magic を呼び出し、完了時に set magic を呼び出していませんでした。 [GH #21012]
msgrcv() は、size 引数を検証する前に、バッファのサイズを変更するために これを使っていました。 [GH #21012]
階層的に新しいクラスの祖先であるクラスから継承する場合、たとえば class A::B:isa(A){.}
は親クラスをロードしようとしませんでした。 [GH #21332]
宣言されたリファレンスを state
変数で使えるようになりました。 [GH #21351]
unshift
されてサイズ変更された配列の末尾要素は、 常に初期化されるようになりました。 [GH #21265]
use 5.036
が -X フラグを考慮するようになりました
perl の -X フラグはすべての警告をグローバルに無効にしますが、 "use 5.036" は今までそれを考慮していませんでした。 [GH #21431]
クラスフィールドの初期化処理でエラーが発生した場合の OP リークが修正されました。 [GH #20812]
コードリファレンスに対してスマートマッチングする場合の 帰り値のリークが修正されました。
s/....x$1/g
のような特殊変数を使用した置換の繰り返しの速度低下が 修正されました。 実際には、このような「マジック」変数を含むすべての文字列連結の 速度低下が現象しますが、最後の反復後のみ解放される余分なメモリ使用量のために、 置換を繰り返すと速度低下がより顕著になりました。 速度低下は perl 5.28.0 で始まりました - これは一般的に文字列連結を高速化しましたが、特殊変数を使うと 速度が低下しました。 [GH #21360]
DB
パッケージから eval EXPR;
を呼び出すことによって 実行されたコードでは、レキシカルサブルーチンまたはクロージャ内の 包含スコープからのレキシカル名は表示されませんでした。 これは、サブルーチンが外部スコープへの参照を保持しないようにするために 5.18 に導入されましたが、これにより DB パッケージ内の eval EXPR;
の 特殊な動作が壊れました。
これにより、B::Deparse
の TODO テストが偶然修正されました。 [GH #19370]
オプションで、64ビットプラットフォームで 2**32 エントリを超える 引数スタックに対応します。 これには、引数スタックポインタ自体のためだけに 32 GB のメモリが 必要になるため、これを利用するには大幅に多くのメモリが必要になります。
これを有効にするには、-Accflags=-DPERL_STACK_OFFSET_SSIZET
または 同等のものを Configure
コマンドラインに追加します。
join() で、区切り文字の変更が一貫性なく処理されたり、解放されたメモリに アクセスしたりする可能性があるさまざまな問題が修正されました。 マジックまたは LIST
内の値のオーバーロードによる区切り文字の変更は、 結果の結合された文字列に影響しなくなりました。 [GH #21458]
@{"_<$sourcefile"}
配列の行で dbstate
op が削除されたときに、 その行の整数フラグ IOK
をクリアしません。 これは [GH #19198] を 修正したときに壊れました。 [GH #21564]
スレッドの下や組み込みの perl でロケールを使うための多くのバグ修正が 行われました。 libc バグの回避策も追加されました。 その結果、OpenBSD および UCRT でコンパイルした MingW では、 スレッドセーフなロケール処理のデフォルトになりました。
しかし、テストの結果、Darwin のスレッドセーフなロケール処理の実装には バグがあることがわかりました。 そのため、Perl は Darwin でコンパイルされたときにスレッドセーフな操作を 使おうとしなくなりました。
以前と同様、${^SAFE_LOCALES}
の値が 1 かどうかをチェックすることで、 プログラムがスレッドセーフなロケールで実行されているかどうかを確認できます。
perl が -Accflags=-DNO_LOCALE_NUMERIC
またはその他のロケールカテゴリで 設定されている場合の様々なバグが修正されました。
すべてのロケールカテゴリを同じロケールに設定する必要はありません。 Perl は、以前は文字化けになる可能性があった、いくつかのプラットフォームでの ロケール処理の libc 実装のバグを回避できるようになりました。
LC_ALL
は、すべてのロケールカテゴリが同じロケールに設定されていない場合、 二つの方法のいずれかで表現されます。 Linux や Windows などの一部のプラットフォームでは、表現は一連の 'category=locale-name'
の組の形式になります。 *BSD などの他のプラットフォームでは、表現は name1 / name2 / ...
のような位置になります。 name1 は、他の名前と同様に、プラットフォームによって定義された特定の カテゴリを表します。 名前を区切る順序(前述の /
)もプラットフォームによって異なります。 以前は、位置表記を使うプラットフォームで perl に問題がありました。 これは修正されました。
(*SKIP)
パターンが後に続く +
量指定子に適用される最適化に関する 正規表現エンジンのバグが修正されました。
tmps(揮発性)スタックは指数関数的に増加するようになりました。 以前は直線的に増加していたので、realloc() が O(サイズ) のシステムで sv_2mortal() を何度も呼び出すなどして徐々に増加した場合、 パフォーマンスは O(n*n) になります。 指数関数的に増加すると、これは償却された O(n) に変わります。 [GH #21654]
レキシカルサブルーチンは、包含関数への各再帰呼び出しのパッドに 新しいスタブを持つようになりました。 これは次の二つの問題を解決します:
レキシカルサブルーチンが包含関数を呼び出すと、 "Can't undef active subroutine" というエラーが投げられます。 例えば:
use v5.36.0;
sub outer($oc) {
my sub inner ($c) {
outer($c-1) if $c; # Can't undef active subroutine
}
inner($oc);
}
outer(2);
レキシカルサブルーチンが再帰呼び出しから包含関数に呼び出された場合、 これはレキシカルサブルーチン内のクローズオーバー変数への束縛を 上書きするため、外部再帰呼び出しからレキシカルサブルーチンへの 呼び出しは内部変数からの変数にアクセスできるようになっていました:
use v5.36.0;
sub outer ($x) {
my sub inner ($label) {
say "$label $x";
}
inner("first");
outer("inner") if $x eq "outer";
# this call to inner() sees the wrong $x
inner("second");
}
outer("outer");
prepare_export_lexical() は PL_comppad
と PL_curpad
を別々に 保存していました; これにより、PL_curpad
がもはや有効でない値に復元され、 場合によってはレキシカル変数をインポートするときにパニックが 起きる可能性がありました。 [GH #21981]
use VERSION
宣言のスコープ内で文字列 eval() 操作を行うと、 バージョン番号の格納方法の矛盾のため、 "Downgrading a use VERSION declaration" という 誤った警告が表示されることがありました。 これは修正されました。 [GH #22121]
perlivp is missing streamzip on Windows
(perlivp は Windows で streamzip がありません)
streamzip
ユーティリティは Windows にはインストールされませんが、 インストールされるする必要があります。
perl5300delta は、$[
の削除と同時に行われた arybase
モジュールの 削除を含むように更新されました。
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 メーリングリストにあなたの感謝の言葉をメールします。
変更点の完全な詳細を見る方法については Changes ファイル。
Perl のビルド方法については INSTALL ファイル。
一般的なことについては README ファイル。
著作権情報については Artistic 及び Copying ファイル。
Hey! The above document had some coding errors, which are explained below:
=back without =over
You forgot a '=back' before '=head3'