source::encoding
:writer
attribute on field variablesany
and all
operatorsmy method
->&
^^=
operatorperl5420delta - perl v5.42.0 での変更点
この文書は 5.42.0 リリースと 5.40.0 リリースの変更点を記述しています。
chdir
がサブルーチンとしてCORE:: 名前空間に追加されました。
以前は、&CORE::chdir($dir)
や my $ref = \&CORE::chdir; $ref->($dir)
の ようなコードは、&CORE::chdir cannot be called directly
というエラーを 投げていました。 このような場合は、今では完全に対応しています。
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 文字の意味は未定義です。
: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);
any
and all
operators二つの新しい実験的機能が追加されました; リスト処理演算子 any
と all
です。
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_any
と experimental::keyword_all
および experimental::keyword_any
およびexperimental::keyword_all
という 名前になります。
これは 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
my method
Perlバージョン 5.18 以降の sub
と同様に、method
の前に my
キーワードを付けることができるようになりました。 これは、パッケージの可視性ではなく、レキシカルな可視性を 持つサブルーチンを宣言します。 さらなる詳細については、perlclass を参照してください。
->&
メソッドをレキシカルに宣言する機能に加えて、このリリースでは、通常の 名前ベースのメソッド解決を迂回して、メソッドであるかのように レキシカルサブルーチンを呼び出すこともできます。
レキシカルメソッド宣言と組み合わせることで、これら二つ新しい機能は プライベートメソッドを持つ効果を生み出します。
"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
Perl は、Unicode 15.1 https://www.unicode.org/versions/Unicode15.1.0/ で 導入された変更を含め、 16.0 https://www.unicode.org/versions/Unicode16.0.0/ に 対応するようになりました。
^^=
operatorPerl 5.40.0 では、論理中置排他的論理和演算子 ^^
が導入されました。 この時点では、代入版 ^^=
も欠落していることに気づきませんでした。 これが追加されました。
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 に適用できます。
Perl スレッドのクローン化には、ファイル操作が意図しないパスを ターゲットにする可能性がある作業ディレクトリの競合状態がありました。 Perl 5.42 では、各ハンドルへの chdir がなくなりました。
この問題は、[GH #23010] を介して Vincent Lefèvreによって発見され、 CPAN Security Groupによって [CVE-2025-40909]が 割り当てられました。
修正は、[GH #23019] および [GH #23361] を通じて 提供されました。
Perl 5.40 では、デバッガで使用されるパッケージ DB
内の eval EXPR
の 特殊な動作を破壊する Perl 5.18 で導入されたバグを修正するために、 関数からその関数を含む関数への無条件参照が再導入されました。
場合によっては、この変更により、クロージャと他の既存の参照との間で 循環参照チェーンが発生し、メモリリークを引き起こしていました。
この変更は元に戻され、 [GH #22547] は修正されましたが、 [GH #19370] は再び 壊れました。
これは、参照ループが発生しないこと、および囲んでいる関数からの レキシカル変数および関数がデバッガで表示されない可能性があることを 意味します。
関数内でeval EXPR
を呼び出すと、常にそうであるように、 無条件にその関数を囲む関数を参照することに注意してください。
定数畳み込みされた文字列は、コピーオンライト機構経由で 共有できるようになりました。 [GH #22163]
次のコードでは、以前はそれぞれ 100 万個の "A" を含む 11 個の文字列バッファが 割り当てられていました:
my @scalars; push @scalars, ("A" x 1_000_000) for 0..9;
これは、単一のバッファが割り当てられ、CONST OP と @scalars
の 10 個の スカラ要素との間で共有されるようになりました。
(おそらくテストファイル内の)この種の定数を使ってメモリーリークを シミュレートするコードは、文字列のコピーと個別のバッファの 割当てを引き起こすために、文字列を変更しなければならなくなったことに 注意してください。 たとえば、("A" x 1_000_000).time
は、適切な小さな変更でしょう。
tr///
は、変換される文字が tr/A-Z/a-z/
のように ASCII 範囲である限り、 オペランドの内部表現に関係なく同じ速度で実行されるようになりました。 以前は、内部エンコーディングが UTF-8 の場合、より低速でより一般的な 実装が使われていました。
builtin モジュールの indexed
関数を使って、配列またはリストから インデックス/値の組のリストを生成し、それを 2 変数のforeach
リストに 渡して再度展開するコードが、より効率的になるように 最適化されるようになりました。
my @array = (...);
foreach my ($idx, $val) (builtin::indexed @array) {
...
}
foreach my ($idx, $val) (builtin::indexed LIST...) {
...
}
特に、元のサイズの 2 倍の一時的なリストは生成されなくなりました。 代わりに、ループは、foreach (@array)
または foreach (LIST)
が 行うのと同じ方法で、元の配列またはリストを直接反復します。
覗き穴最適化器は、次のゼロオフセット substr
パターンを認識し、 新しい専用演算子 (OP_SUBSTR_LEFT
) に交換します。 [GH #22785]
substr($x, 0, ...)
substr($x, 0, ..., '')
"print" in perlfunc と "say" in perlfunc による整数の文字列化は、 SVt_IV
から来る場合、より効率的になりました。 [GH #22927]
文字列バッファが「掃き出し」されていない場合、単一の引数からの文字列反転が 単一のパスで行われるようになり、著しく高速になりました。 改善の程度はコンパイラとハードウェアに依存します。 [GH #23012]
Archive::Tar はバージョン 3.02_001 から 3.04 に更新されました。
B::Deparse はバージョン 1.76 から 1.85 に更新されました。
Benchmark はバージョン 1.25 から 1.27 に更新されました。
builtin はバージョン 0.014 から 0.019 に更新されました。
Compress::Raw::Bzip2 はバージョン 2.212 から 2.213 に更新されました。
Compress::Raw::Zlib はバージョン 2.212 から 2.213 に更新されました。
Config::Perl::V はバージョン 0.36 から 0.38 に更新されました。
CPAN はバージョン 2.36 から 2.38 に更新されました。
CPAN::Meta::YAML はバージョン 0.018 から 0.020 に更新されました。
Data::Dumper はバージョン 2.189 から 2.192 に更新されました。
DB はバージョン 1.08 から 1.09 に更新されました。
DBM_Filter はバージョン 0.06 から 0.07 に更新されました。
Devel::Peek はバージョン 1.34 から 1.36 に更新されました。
Devel::PPPort はバージョン 3.72 から 3.73 に更新されました。
Digest::MD5 はバージョン 2.58_01 から 2.59 に更新されました。
DynaLoader はバージョン 1.56 から 1.57 に更新されました。
experimental はバージョン 0.032 から 0.035 に更新されました。
Exporter はバージョン 5.78 から 5.79 に更新されました。
ExtUtils::CBuilder はバージョン 0.280240 から 0.280242 に更新されました。
ExtUtils::MakeMaker はバージョン 7.70 から 7.76 に更新されました。
ExtUtils::ParseXS はバージョン 3.51 から 3.57 に更新されました。
ExtUtils::Typemaps はバージョン 3.51 から 3.57 に更新されました。
Fcntl はバージョン 1.18 から 1.20 に更新されました。
feature はバージョン 1.89 から 1.97 に更新されました。
fields はバージョン 2.25 から 2.27 に更新されました。
File::Spec はバージョン 3.90 から 3.94 に更新されました。
Getopt::Long はバージョン 2.57 から 2.58 に更新されました。
HTTP::Tiny はバージョン 0.088 から 0.090 に更新されました。
IO::Compress はバージョン 2.212 から 2.213 に更新されました。
IO::Socket::IP はバージョン 0.42 から 0.43 に更新されました。
IPC::Open3 はバージョン 1.22 から 1.24 に更新されました。
locale はバージョン 1.12 から 1.13 に更新されました。
Math::BigInt はバージョン 2.003002 から 2.005002 に更新されました。
Math::BigInt::FastCalc はバージョン 0.5018 から 0.5020 に更新されました。
Math::Complex はバージョン 1.62 から 1.63 に更新されました。
Memoize はバージョン 1.16 から 1.17 に更新されました。
Module::CoreList はバージョン 5.20240609 から 5.20250702 に更新されました。
NDBM_File はバージョン 1.17 から 1.18 に更新されました。
ODBM_File はバージョン 1.18 から 1.20 に更新されました。
Opcode はバージョン 1.65 から 1.69 に更新されました。
overload はバージョン 1.37 から 1.40 に更新されました。
parent はバージョン 0.241 から 0.244 に更新されました。
perlfaq はバージョン 5.20240218 から 5.20250619 に更新されました。
Pod::Usage はバージョン 2.03 から 2.05 に更新されました。
podlators はバージョン 5.01_02 から v6.0.2 に更新されました。
POSIX はバージョン 2.20 から 2.23 に更新されました。
re はバージョン 0.47 から 0.48 に更新されました。
Safe はバージョン 2.46 から 2.47 に更新されました。
Scalar::Util はバージョン 1.63 から 1.68_01 に更新されました。
Search::Dict はバージョン 1.07 から 1.08 に更新されました。
SelfLoader はバージョン 1.27 から 1.28 に更新されました。
sort はバージョン 2.05 から 2.06 に更新されました。
Storable はバージョン 3.32 から 3.37 に更新されました。
strict はバージョン 1.13 から 1.14 に更新されました。
Term::Table はバージョン 0.018 から 0.024 に更新されました。
Test::Harness はバージョン 3.48 から 3.50 に更新されました。
Test::Simple はバージョン 1.302199 から 1.302210 に更新されました。
Thread はバージョン 3.05 から 3.06 に更新されました。
threads はバージョン 2.40 から 2.43 に更新されました。
threads::shared はバージョン 1.69 から 1.70 に更新されました。
Tie::File はバージョン 1.09 から 1.10 に更新されました。
Tie::RefHash はバージョン 1.40 から 1.41 に更新されました。
Time::HiRes はバージョン 1.9777 から 1.9778 に更新されました。
Time::Piece はバージョン 1.3401_01 から 1.36 に更新されました。
Unicode::UCD はバージョン 0.78 から 0.81 に更新されました。
utf8 はバージョン 1.25 から 1.27 に更新されました。
version はバージョン 0.9930 から 0.9933 に更新されました。
VMS::Filespec はバージョン 1.13 から 1.15 に更新されました。
warnings はバージョン 1.69 から 1.74 に更新されました。
Win32 はバージョン 0.59 から 0.59_01 に更新されました。
XS::APItest はバージョン 1.36 から 1.43 に更新されました。
私たちはこの文書で挙げられた変更を反映するように文書を更新しようとしています。 もし抜けている物を発見したら、 https://github.com/Perl/perl5/issues でイシューを開いてください。
それに加えて、以下のような変更が行われました。
関連する関数のいくつかのグループの文書を一つのエントリにまとめました。
gv_fetchmeth()
のすべての形式が一緒に文書化されました。
gv_autoload4
は、gv_autoload_pv
と共に文書化され、 追加の注意事項が追加されました。 長い Perl_
形式は、利用可能な場合に一覧化されるようになりました。
2 進数および 8 進数の浮動小数点定数 (012.345p-2
や 0b101.11p-1
など) が 文書化されました。 この機能は、最初に perl 5.22.0 で 16 進数の浮動小数点定数とともに導入され、 perl 5.28.0 でいくつかのバグ修正が行われましたが、正式に 文書化されることはありませんでした。 [GH #18664]
組み込み型とクラス名に関連する ref
と reftype
の記述を明確化しました。
perl sort
が(v5.8.0 以降)安定していることを明確にしました。
rand()
関数の推奨される代替関数は、 CPAN Security Group によって推奨される モダンなモジュールに更新されました。 [GH #22873]
2024-07-17 の最新の選挙の終了を受けて、運営委員会とコアチームのメンバーの リストが更新されました。
「本物の」AV
と「偽の」AV
の比較に関する説明を追加しました。
文書が更新され、Newx
, Renew
, Safefree
と malloc
, realloc
, free
の混在は許されず、二つのグループの API 間でのポインタの混在は 許されないことが反映されました。 更新は perlguts と perlclib に対して行われました。
TARG
の説明に追加の警告が追加されました。
perlop の一部は、同じ優先順位を持つすべての演算子が一つのの節内に あるように順序付けられ、セクションは最も優先順位の高い演算子が 最初に表示されるように順序付けられることを想定しています。 この順序は復元されました。 その他の再編成は、明確性を向上させるために行われ、より基本的な操作は、 それらに依存する操作の前に説明されるようになりました。
ヒヤドキュメントの文書は整理され、再編成されました。 インデントされたヒヤドキュメントは以前は別々に文書化されていましたが、 現在では二種類の文書が織り交ぜられており、よりコンパクトで 理解しやすくなっています。
xor
演算子の文書が拡張されました。
UTF-8 ロケールでの関係文字列演算子の使用に関する 古いアドバイスは削除されました。 最良の結果を得るには Unicode::Collate を使いますが、これらの演算子は 多くのプラットフォームで適切な結果を提供します。
そのままの節のアライメントが正規化され、インデントを削除する一部の Pod ビューワでの表示方法が修正されました。
$#
および $*
のエントリについて、これらを使うと警告ではなく コンパイルエラーが発生するということを注意するように修正されました。
次のような追加と変更が、警告や致命的エラーメッセージを含む診断出力に 行われました。 診断メッセージの完全な一覧については、perldiag を参照してください。
Use of non-ASCII character 0x%X illegal when 'use source::encoding "ascii"' is in effect
(F) このプラグマは、そのスコープ内で非 ASCII 文字を禁止します。
Undefined subroutine &%s called, close to label '%s'
(F) 示されたサブルーチンが定義されていないか、以前定義されていたとしても、 その後未定義になりました。
このエラーは、二つのコロンではなく一つのコロンが入力された場合に、 パッケージ区切り文字の入力ミスを示すこともあります。 たとえば、Foo:bar()
は、ラベル Foo
の後に修飾されていない関数名が 続くものとして解析されます: foo: bar()
。 [GH #22860]
(S experimental::class) この警告は、use feature 'class'
の __CLASS__
キーワードを使った場合に発生します。 このキーワードは現在実験的なものであり、Perl の将来のリリースで動作が 変更される可能性があります。
%s() attempted on handle %s opened with open()
(W io) open() で開いたハンドルに対して readdir(), telldir(), seekdir(), rewinddir(), closedir() を呼び出しました。 ディレクトリの内容を走査するためにこれらの関数を使いたい場合、 opendir() でハンドルを開く必要があります。
Possible precedence problem between ! and %s
(W precedence) 次のようなものを書きました:
!$x < $y # parsed as: (!$x) < $y
!$x eq $y # parsed as: (!$x) eq $y
!$x =~ /regex/ # parsed as: (!$x) =~ /regex/
!$obj isa Some::Class # parsed as: (!$obj) isa Some::Class
しかし、!
は比較演算子 =~
および isa
よりも優先順位が高いため、 これは比較/マッチングの結果を否定するのではなく、最初のオペランドの論理否定を 比較/マッチングするものとして解釈されます。
あいまいさをなくすには、否定された比較/束縛演算子を使うか:
$x >= $y
$x ne $y
$x !~ /regex/
かっこか:
!($x < $y)
!($x eq $y)
!($x =~ /regex/)
!($obj isa Some::Class)
優先順位の低い not
演算子を使います:
not $x < $y
not $x eq $y
not $x =~ /regex/
not $obj isa Some::Class
(最初のオペランドを否定した真偽値の結果を比較することを意味していた場合は、 (!$x) < $y
, (!$x) eq $y
などのようにかっこで囲みます。)
注: この警告は、!!$x == $y
のようなコード、つまり、二重否定 (!!
) が 真偽値への変換演算子として使われてコードでは引き起こされません。
%s() attempted on invalid dirhandle %s
これは、[GH #22394] の リファクタリングの一部として、readdir(), telldir(), seekdir(), rewinddir(), losedir() の個別のメッセージから統合されました。
Useless use of %s in void context
この警告は、0 < $x < 1
のような連鎖比較の使用で 引き起こされるようになりました。 [GH #22969]
キーが未定義の tie されていないハッシュ要素への左辺値参照である @_
の関数引数にアクセスするときに、 この警告が発生しないようになりました。 この警告は、呼び出しの時点では未だに生成されます。 [GH #22423]
個別インストール(インストールされたモジュールを上書きしない)が デフォルトになりました。
文書が大幅に強化されました。
C ロケールのみを使用するプラットフォーム(例: "Gentoo Prefix") での コンパイルを修正しました [GH #22569]。 バグは最初にダウンストリーム bugs.gentoo.org/939014 で報告されました。
(ほとんど文書化されていない) 設定マクロ PERL_STRICT_CR
が削除されました。 これを (たとえば./Configure -A ccflags=-DPERL_STRICT_CR
で) 有効にすると、 ソースファイルで CR(キャリッジリターン)文字が検出されたときに、 perl パーサが致命的なエラーを投げるようになります。 perl パーサのデフォルトの(そして今では唯一の)動作は、改行文字と対になった CR を取り除き、それ以外の場合は空白として扱うことです。
(PERL_STRICT_CR
は、オプションでソースファイルの CR がエラーになった perl 5.004 との下位互換性を復元するために perl 5.005 で導入されました。 それ以前は、CR は受け入れられていましたが、ヒヤドキュメントのような 引用された複数行の構文では、行の末尾であっても文字通り保持されていました。)
同様に、(さらに文書化されていない) 設定マクロ PERL_CR_FILTER
が 削除されました。 有効にすると、デフォルトのソースフィルタがインストールされ、 パーサがソースコードを見る前にソースコードからキャリッジリターンを 取り除きます。
このリリースのその他の追加と変更を反映してテストが追加、変更されました。 さらに、主に以下のような変更が行われました:
既知の修正されていないバグに対する TODO テストの場所として、 新しい t/run/todo.t テストスクリプトが追加されました。 このファイルに追加するパッチを歓迎します。
perl をビルドしている C コンパイラに対応する C++ コンパイラに対する perl ヘッダのテストが追加されました。 [GH #22232]
Configure で use64bitall を使用するときの arm64 darwin のヒントを 修正しました。 [GH #22672]
[GH #22627] に関連して Android の perl_langinfo.h [GH #22650] を変更しました。
cygwin.c: いくつかのばかげた/ひどい C エラーを修正しました。 [GH #22724]
cygperl*.dll
に対して、--enable-auto-image-base
によって生成された ベースアドレスと競合しない明示的なベースアドレスを指定しました。 [GH #22695] [GH #22104]
MacOS 15 (Darwin 24) 以降でロケールを使用した文字列の照合は、 libc でのアサーションの失敗によりオフになっています。
以前のバージョンでも(locale.t での失敗など)問題が発生している場合は、 ./Configure
の起動に -Accflags=-DNO_LOCALE_COLLATE
オプションを 追加するか、config.sh の ccflags
および cppflags
変数に -DNO_LOCALE_COLLATE
を追加することで、ロケール照合を明示的に 無効にすることができます。
"sv_strftime_ints
" in perlapi 関数が導入されました。 これは、下位互換性のために保持されている "my_strftime
" in perlapi の 拡張版です。 どちらも、年、月、時などがある場合に strftime(3) を呼び出します。 新しい関数は UTF-8 を処理し、夏時間の可能性を考慮するかどうかを指定できます。 my_strftime
は DST を考慮しません。
bytes_to_utf8
, bytes_from_utf8
, bytes_from_utf8_loc
関数は 実験的なものではなくなりました。
G_DISCARD
フラグが設定された call_argv() を 呼び出すと、argv
引数から構築された SV 引数が、 call_argv()
が返る前に解放されます。 以前は、次の FREETMPS で解放されていました。 [GH #22255]
-DDEBUGGING
コンパイルオプションを使ってビルドされた場合、 異なるタイプの SV(AV, HV, CV) へのポインタを取る perl API 関数は、 渡された値の SvTYPE()
をチェックして、それらが有効であることを 確認します。 さらに、渡された参照値から AV, HV, CV を抽出しようとする コア関数内の内部コードも、このようなチェックを実行します。
これは通常の Perl CI テストによって完全にテストされていますが、 それ以外の有効な呼び出しでこれらの制約に違反するコーナーケースが まだいくつかある可能性があります。 これらが見つかった場合は、さらに調査し、それを考慮して特定のコードを 調整する必要があります。
op_dump()
関数が拡張され、最近の OP_METHSTART
および OP_INITFIELD
op に関する追加情報と、これまで行われていなかった OP_ARGCHECK
および OP_ARGELEM
に関する追加情報が 含まれるようになりました。
op_dump()
には、カスタム演算子が XOP
構造体の新しい xop_dump
要素経由でヘルパー関数を登録する場合に、カスタム演算子に 関する追加のデバッグ情報を出力する機能も追加されました。 詳細については、perlguts への 関連する追加を参照してください。
UTF-8 でエンコードされた文字列を対応する序数符号位置に変換する新しい API 関数が導入されました。 これらはデフォルトで安全に使用でき、一般的に既存のものよりも便利です。
"utf8_to_uv
" in perlapi および "utf8_to_uv_or_die
" in perlapi は、"utf8_to_uvchr
" in perlapi (下位互換性のために保持されています) を 置き換えますが、古い形式を安全に使用していない可能性があるため、 新しい形式を使うように変換するべきです。
逆方向に変換するには、"uv_to_utf8
" in perlapi を使えるようになりました。 これは新しい関数ではなく、"uvchr_to_utf8
" in perlapi の新しい同義語です。 二つの名前のセットを学習する必要がないように追加されました。
また、"strict_utf8_to_uv
" in perlapi と "c9strict_utf8_to_uv
" in perlapi という二つの新しい関数もあります; これらの関数は同じことを行いますが、入力文字列が、厳密な元の定義 (strict_utf8_to_uv
) または Unicode Corrigendum #9 によって与えられた、より緩やかな定義 (c9strict_utf8_to_uv
) のいずれかを使って、Unicode が交換に対して合法として 受け入れない符号位置を表す場合は異なります。 入力文字列が制限された符号位置の一つを表す場合、これらの関数は代わりに Unicode REPLACEMENT CHARACTER
を返します。
また、"extended_utf8_to_uv
" in perlapi は utf8_to_uv
の同義語であり、 Perl 拡張 UTF-8 の全範囲が受け入れられることを強調したい場合に使います。
また、おそらく使う必要のない三つの特殊な変換関数に代わる関数もあります。 ここでも、下位互換性のために古い形式が保持されていますが、 新しい形式を使うように変換するべきです。
"utf8_to_uv_flags
" in perlapi は、"utf8n_to_uvchr
" in perlapi を 置き換えます。
"utf8_to_uv_errors
" in perlapi は、"utf8n_to_uvchr_error
" in perlapi を 置き換えます。
"utf8_to_uv_msgs
" in perlapi は、"utf8n_to_uvchr_msgs
" in perlapi を 置き換えます。
また、逆関数 "uv_to_utf8_flags
" in perlapi および "uv_to_utf8_msgs
" in perlapi も追加されています; これらは、それぞれ既存の関数 "uvchr_to_utf8_flags
" in perlapi および "uvchr_to_utf8_flags_msgs
" in perlapi の同義語です。 これらは、二つの名前のセットを学ぶ必要がないようにするためだけに 提供されています。
UTF-8 でエンコードされた文字列を(可能であれば)ネイティブな バイト形式に変換するために、三つの新しい API 関数が導入されました。 これらは既存の関数よりも使いやすく、不要なメモリ割り当てを回避します。 関数は、変換結果で入力文字列を上書きしても問題がない場合に使われる "utf8_to_bytes_overwrite
" in perlapi と、 元の文字列をそのまま保持する必要がある場合に使われる "utf8_to_bytes_new_pv
" in perlapi および "utf8_to_bytes_temp_pv
" in perlapi です。 utf8_to_bytes_temp_pv
は、自動的に破棄される perlapi/SAVEFREEPV
を使って結果を一時的に返します。 utf8_to_bytes_new_pv
では、変換が成功した場合に返される、新しく 割り当てられたメモリを解放する必要があります。
後者の二つの関数は、メモリを不必要に使ったり、不必要に大きく使ったりする "bytes_from_utf8
" in perlapi を置き換えるために設計されています。
新しいAPI関数 valid_identifier_pve()
, valid_identifier_pvn()
, valid_identifier_sv()
が追加されました; これらの関数は、文字列が Perl によって有効な識別子名と 見なされるかどうかをテストします。
SVt_IV から SVt_NV (またはその逆)に割り当てる場合、両方が 「ボディレス」型であれば、Perl_sv_setsv_flags は宛先型を ソース型に一致するように変更します。 以前は、SVt_IV は NV を格納するために SVt_PVNV に昇格され、 SVt_NV は IV を格納するために SVt_PVIV に昇格されていました。 この変更により、関連するボディ構造体を割り当て、 後で解放する必要がなくなりました。
ネイティブバイト形式でエンコードされた文字列を UTF-8 に変換するために、 二つの新しい API 関数が導入されました。 これらの関数は、UTF-8 表現が元の文字列と同じ場合は、 文字列を変更せずに返します。 それ以外の場合は、変換された文字列を含む新しいメモリが割り当てられます。 これは、常に新しいメモリを割り当てる既存の "bytes_to_utf8
" in perlapi とは対照的です。 新しい関数は、"bytes_to_utf8_free_me
" in perlapi および"bytes_to_utf8_temp_pv
" in perlapi です。 "bytes_to_utf8_temp_pv
" in perlapi は、新しいメモリが 自動的に解放されるように調整します。 bytes_to_utf8_free_me
は、新しく割り当てられたメモリを 解放する必要があります。
サブルーチンシグネチャをパーサ文法で構文解析する方法が変更されました。
以前は、個々のシグネチャ引数をパースする場合、パーサは、perly.y で 直接定義された大きなアクションブロック内に完全な引数処理 op 木自体を 最終的に構築する前に、パーサスタック上の各引数に対して OP_ARGELEM
op 木フラグメントを蓄積し、それらを OP_LIST
シーケンスで収集していました。
新しい手法では、すべての op 木生成は、パーサ内のアクションブロックによって 呼び出される op.c 内の新しく定義された関数によって処理されます。 これらはパーサスタック上で状態を保持するのではなく、メインの PL_parser
構造体によって参照される専用のメモリ構造内に保持されます。 これは、他のコードからほとんど不透明であり、新しい関数経由でのみ アクセスされることを意図しています。
この新しい配置は、より柔軟なコード生成と将来開発される追加機能を 可能にすることを目的としています。
SV に保存された正規表現のグローバルなマッチング位置と相互作用するために、 三つの新しい API 関数が追加されました。 これらは、sv_regex_global_pos_get()
, sv_regex_global_pos_set()
, sv_regex_global_pos_clear()
です。 これらの API 関数を使うと、XSモジュールが、 PERL_MAGIC_regex_global
マジカル型に関連する、この位置が現在保存されている 方法を認識したり、直接対話したりする必要がなくなります。
新しい SvVSTRING
API マクロ
通常の文字列バッファを通常の SV から取得する SvPV
マクロと同様の方法で、 "vstring" SV から 2 番目の文字列バッファを取得するために使われる 新しい API マクロが追加されました。
STRLEN len;
const char *vstr_pv = SvVSTRING(sv, vstr_len);
"SvVSTRING
" in perlapi を参照してください。
S_SvREFCNT_dec のヌルポインタの逆参照を修正しました [GH #16627]。
DESTROY の feature 'class' セグメンテーションフォルトを修正しました [GH #22278]。
chdir
は、整数ではなく(文書で説明されているように)本当の真偽値を 返すようになりました。 これは、失敗した chdir
の結果が、'0'
ではなく ''
に 文字列化されることを意味します。
複合代入演算子は、さらに変更可能な左辺値を返します。
($x &= $y) += $z;
# Equivalent to:
# $x &= $y;
# $x += $z;
ただし、bitwise
機能 で提供されている 独立した数値/文字列ビット単位演算子 &= ^= |= &.= ^.= |.=
は、 このような左辺値を返していませんでした:
use feature qw(bitwise);
($x &= $y) += $z;
# Used to die:
# Can't modify numeric bitwise and (&) in addition (+) at ...
これは修正されました。 [GH #22412]
v5.39.8 以降、"strftime
" in POSIX では、フォーマット文字列が実際には 文字列ではなく、数値、undef
、またはオブジェクト(オーバーロードされた 文字列変換を持つものであっても)が与えられた場合、クラッシュしたり、 奇妙なエラー (Out of memory in perl:util:safesysmalloc
など)が 発生したりしていました。
strftime
は以前と同様に最初の引数を文字列化するようになりました。 [GH #22498]
また、POSIX::strftime()
も修正されました [GH #22369]。
pack("p", ...)
と pack("P", ...)
は、読み込み専用でない限り、 指定された SV を SvPV_force() するようになりました。 これにより、SV から CoW が削除され、生成されたポインタを介して 書き込むコードが、同じ CoW 文字列バッファを共有する他の SV の値を 変更してしまうことを防ぎます。
注意: これは pack("p",... )
を安全にはしません; SV がマジカルな場合、バッファへの書き込みは次の読み取りで 破棄される可能性があります。 [GH #22380]
open my $fh, ">&", THISHANDLE
のように、"dup" モードで open() で使われているために strict 性が削除された裸の単語の ファイルハンドルに対して、no feature "bareword_filehandles"
を 強制します。 [GH #22568]
goto
を使って末尾呼び出しを行うか、呼び出しに call_sv() および関連する API を使うと、builtin::
パッケージの trim(), refaddr(), reftype(), ceil(), floor(), stringify() のいずれかが、TARG
処理のバグにより クラッシュまたはアサートしていました。 [GH #22542]
I32
の代わりに SSize_t
追加オフセットを受け入れるように sv_gets() を修正しました。 これにより、readpipe
またの名を qx//
および readline
のために大きな SV
に追加するときに整数オーバーフローを 防ぐことができます。 https://www.perlmonks.org/?node_id=11161665
utf8n_to_uvchr
が特定の無効な UTF-8 シーケンスを無効として 正しく識別できない問題が修正されました。 特に、継続バイトまたは割り当てられていないバイトで始まる シーケンスは、予期しない動作またはパニックを引き起こす可能性がありました。 この修正により、このような無効なシーケンスが適切に検出され、 処理されるようになります。 この修正により、Encode.pm
などの UTF-8 処理を処理するモジュールの 関連する問題も解決されます。
perl パーサは、一部の POD 指示子を =cut
であるかのように誤って パースしていました。 名前が cut で始まる他のいくつかの POD 指示子は、埋め込まれた POD 節を途中で終了させていました。 次のケースが影響を受けました: cut の後に数字が続く(例: =cut2studio
)、 cut の後にアンダースコアが続く(例: =cut_grass
)、 文字列 eval
では、cut で始まる任意の識別子(例: =cute
)。 [GH #22759]
32 ビット x86 システムで -msse
と quadmath を使ったビルドを行うと、 ビルドの初期段階でアライメントがずれたアクセスによりクラッシュします。 [GH #22577]
POSIX ライクなシステムのスレッド化されたビルドでは、perl シグナルハンドラが シグナルを受信した場合、メインの perl スレッドにシグナルを 再送するようになりました。 以前はクラッシュしていました。 [GH #22487]
サブルーチン内で state
を使ってレキシカルスコープの配列または ハッシュを宣言し、直後に返っても、 "Bizarre copy of HASH/ARRAY in subroutine exit" エラーが 発生しなくなりました。 [GH #18630]
builtin::trim()
は TARG
を適切にクリアしていませんでした; これにより、2 番目の評価で使われた値のキャッシュされた 数値版が古くなる可能性がありました。 キャッシュされた値を適切にクリアするようになりました。 [GH #22784]
"shmread" in perlfunc と "shmwrite" in perlfunc はもはや 31 ビット値に 制限されなくなり、POS 引数と SIZE 引数にプラットフォーム上で使用可能な すべてのビットを使えるようになりました。 [GH #22895]
VAR がプレーンな文字列でない場合の "shmread" in perlfunc の動作が改善されました。 VAR が tie された変数の場合、STORE
を 1 回呼び出します; 以前は、結果を使わない FETCH
も呼び出していました。 VAR がリファレンスの場合、VAR が文字列に変換されると、参照されるエンティティの 参照カウントが適切に減少します; 以前は、メモリリークしていました。 [GH #22898]
"%SIG" in perlvar で説明されているように、$SIG{__DIE__}
および $SIG{__WARN__}
ハンドラは、意図的であるか偶発的であるかにかかわらず、 もはや再帰的に呼び出すことができなくなりました。 つまり、例外(または警告)によって $SIG{__DIE__}
(または $SIG{__WARN__}
)ハンドラの呼び出しが引き起こされると、 元の $SIG{__DIE__}
(または $SIG{__WARN__}
) ハンドラの呼び出しから 返るまで、%SIG
を無視して、それ以降の例外(または警告)が 直接処理されます。 [GH #14527], [GH #22984], [GH #22987]
オブジェクトの ObjectFIELDS()
とオブジェクトのスタッシュの xhv_class_fields
は、常に NULL または非 NULL であるとは限らず、 sv_dump()
(したがって Devel::Peek の Dump()
) を混乱させ、 フィールドが定義されていないオブジェクトでクラッシュする場合がありました。 [GH #22959]
UTF-8 ロケールを使って文字列を比較する場合、以前は、一方または両方に 0x110000 などの Unicode 以上の符号位置が含まれている場合の振る舞いは 未定義でした。 このような符号位置はすべて、最も高い Unicode 符号位置である U+10FFFF と同じように照合されるようになりました。 [GH #22989]
正規表現内で、 \g{...}
後方参照の内容が適切に検証されるようになりました。 以前は、\g{1 FOO}
は暗黙に \g{1}
としてパースされ、 最初の数値以降はすべて無視されていました。 [GH #23050]
マッチングを実行したコードの同じ部分に再帰したコードブロックを含む 実行時パターンは、クラッシュを引き起こす可能性がありました。 [GH #22869]
例えば:
my $r = qr/... (?{ foo() if ... }) .../;
sub foo { $string =~ $r }
foo()
場合によっては、eval
がデバッガによって保存されたソース行に 整数部分を追加しないことがありました。 [GH #23151]
デバッグモードでは、perl はデバッガで使うためにすべてのファイルの ソース行(および各行がブレーク可能かどうかの印)を保存します。 内部ストレージ形式は、より少ないメモリを使うように最適化されます。 これにより、64 ビットシステムでは保存された行ごとに 24 バイトが節約され、 -Duselongdouble
または -Dusequadmath
ビルドではさらに節約されます。 [GH #23171] で 議論されています。
フォークエミュレーション用の保存スタックのクローンを作成しても、 RExC 状態の解放が重複しないようになりました。 [GH #23022]
last
などのループ出口を使うコード参照に対してスマートマッチングを行うと、 perl がクラッシュしていました。 [GH #16608]
perlclass によるクラス初期化子や ADJUST
ブロックが last
や 他のループ終了を呼び出すと、perl がクラッシュしていました。 [GH #16608] と同じ原因です。
defer {}
または finally {}
ブロック内で完全にスローおよび キャッチされた例外は、外側の実行ループを停止しなくなりました。
次のようなコードは、内部 try
/catch
ブロックの内部例外が キャッチされると、defer
ブロックの内容の実行を停止していました。 これは現在修正されており、期待どおりに実行されます。 ([GH #23064])。
defer {
try { die "It breaks\n"; }
catch ($e) { warn $e }
say "This line would never run";
}
"readline" in perlfunc は、読み込み中にエラーが発生し、そのエラーが EAGAIN
または EWOULDBLOCK
である場合、エラーフラグを クリアするようになりました。 これにより、readline
に依存するコードがすべてのエラーをクリアして、 これらの比較的無害なエラーを無視できるようになります。 [GH #22883]
open
は、undef
をファイル名として渡すと、自動的に 匿名一時ファイルを作成します:
open(my $fh, "+>", undef) or die ...
これは、未定義値が undef
関数によって返された値である場合にのみ 機能することになっています。
5.41.3 より前の perl では、存在しないハッシュキーや配列要素の照会によって 同じ未定義値が生成される可能性があり、ユーザレベルのコードで バグが発生する可能性があるため、これは問題を引き起こしていました ([GH #22385] として 報告されています)。
5.41.3 では、コールサイトの構文木に基づくチェックが追加され、 すべてではないけれどもいくつかの一般的なケースでこの問題が修正されましたが、 その代償として、open
をラップして匿名ファイルモードを公開する API の機能が破壊されました。 このような API の注目すべき例は、autodie です。
このリリースでは、当面の間、新しい問題よりも古い問題を優先して巻き戻します。
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 (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 メーリングリストにあなたの感謝の言葉をメールします。
変更点の完全な詳細を見る方法については Changes ファイル。
Perl のビルド方法については INSTALL ファイル。
一般的なことについては README ファイル。
著作権情報については Artistic 及び Copying ファイル。