perl5360delta - perl v5.36.0 での変更点
この文書は 5.34.0 リリースと 5.36.0 リリースの変更点を記述しています。
use v5.36
いつも通り、use v5.36
は、このバージョンの Perl のための 機能の束をオンにします。
5.36 の束は signatures
機能を有効にします。 Perl バージョン 5.20.0 で導入され、それから何回か変更された サブルーチンシグネチャは、もはや実験的とは扱われなくなりました。 これは安定版の言語機能として扱われ、もはや警告を出さなくなりました。
use v5.36;
sub add ($x, $y) {
return $x + $y;
}
これにも関わらず、サブルーチンシグネチャのいくつかの要素はまだ 実験的なままです; 以降を参照してください。
5.36 の束は isa
機能を有効にします。 Perl バージョン 5.32.0 で導入されたこの演算子は、それから 変更されていません。 この演算子は安定した言語機能とみなされます。 さらなる詳細については "Class Instance Operator" in perlop を 参照してください。
5.36 の束はまた、indirect
, multidimensional
の各機能を 無効 にしました。 これらはそれぞれ、次のものを禁止します: ($x = new Class;
のような) 「間接」メソッド呼び出し; 疎らな多次元配列をシミュレートするためのハッシュキーとしての リスト式の使用。 これらの変更の詳細は feature にありますが、短く言うと; これは use strict
をもっと有効にしたものに少し似ていて、 有効性よりも大きな問題を引き起こす機能を無効にします。
さらに、use v5.36
は、use warnings
を書いたかのように警告も 有効にします。
最後に、このリリースでは、v5.10 で導入されてから全ての機能の束に含まれていた 実験的な switch
機能は、v5.36 の束では取り除かれました。 (私たちの助言に反して) これを使いたい場合、明示的に有効にする必要があります。
新しいコマンドラインフラグである -g が利用可能です。 これは -0777 と似たような別名です。
さらなる情報については、"-g" in perlrun を参照してください。
詳しくは https://www.unicode.org/versions/Unicode14.0.0/ を 参照してください。
このリリースより前では、正規表現集合機能 (公式名は「拡張大かっこ文字クラス」 ("Extended Bracketed Character Classes") は実験的と考えられていました。 Perl バージョン 5.18.0 で導入され、 それから数回修正されたこれは、 安定版の言語機能として考えられるようになり、 もはや警告は表示されません。 "Extended Bracketed Character Classes" in perlrecharclass を参照してください。
このリリースの前では、あらゆる形式の可変長後方参照は、 実験的であると考えられてきました。 このリリースで、実験的なステータスは、捕捉かっこを含む後方参照のみに 縮小されました。 これは、次の場合に
"aaz"=~/(?=z)(?<=(a|aa))/
マッチングと $1 への代入は "a" になるか "aa" になるかがはっきりしていないからです。 現在の所、これは可能な最大の選択肢である "aa" にマッチングします。 構文全体が、マッチングするべき時にだけマッチングするようになったことには 自信がありますが、現在の「最長マッチング」の振る舞いを維持することには 自信がありません。
浮動小数点数例外は、SIGSEGV のようなその他の「失敗」系と同様に 直ちに配送されるようになりました。 つまり、そのようなシグナルを $SIG{FPE}
ハンドラで捕捉する機会が 少なくとも 1 回あるということです; 例えば、die
はそれを引き起こした perl での行を報告できます。
しばしば !!0
and !!1
としてアクセスされ、 多くのコア関数と演算子から返される、「真」と「偽」のブール値は、 変数への代入を通してもブール値としての性質を保つようになりました。 builtin の新しい関数 is_bool()
で、値がブール値の性質を 持つかかどうかをチェックできるようになりました。
これは、色々な用途の中でも、他の言語やデータ型直列化との相互運用に 有用でしょう。
かっこの中にレキシカル変数のリストを指定することで、 一回当たり複数の値を反復できるようになりました。 例えば:
for my ($key, $value) (%hash) { ... }
for my ($left, $right, $gripping) (@moties) { ... }
perl v5.36 より前では、for my
の後でリストを指定しようとすると 文法エラーでした。
この機能は今のところ実験的で、 experimental::for_list
カテゴリの警告を引き起こします。 さらなる情報については "Compound Statements" in perlsyn を参照してください。 一度に n 回の foreach の便利ツールである、この文書の "builtin::indexed" も参照してください。
新しいコアモジュール builtin が追加されました; これは、インタプリタ組み込みの、常に存在する関数の文書を提供します。
say "Reference type of arrays is ", builtin::reftype([]);
これはまた、これらの関数の短い名前版を提供するためのレキシカルな インポート機構を提供します。
use builtin 'reftype';
say "Reference type of arrays is ", reftype([]);
この組み込み関数機構とそれが提供する関数は、現在の所全て 実験的 です。 builtin
自体は近い将来実験的であるのをやめる予定ですが、 その中の個々の関数は現行の基準で安定版になる予定です。 その他の関数は、時間とともに builtin
に追加される予定です。
詳しくは builtin を参照してください; しかし、以下は v5.36 の組み込み関数の要約です:
この関数は、引数を文字列として扱い、 その先頭と末尾の空白を削除した結果を返します。
この関数は、引数リストの 2 倍の大きさのリストを返します; それぞれのアイテムは、リストの中のインデックスが前に付きます。 これは主に、配列やリストに対して、ここのアイテムのインデックスも 追跡しながら反復するために、 複数の反復子変数を使うという、 新しい foreach
文法 を使うときに有効です:
use builtin 'indexed';
foreach my ($index, $val) (indexed @array) {
...
}
true
と false
は、ブール値の真と偽の値を返します。 Perl は perl のままで、ブール値の厳密な型はありませんが、 これらの値はブール値として作られたことを知っています。 is_bool
は、ある値がブール値として作られたということが 分かっているかどうかを返します。
これらの関数はそれぞれ次のことを行います: リファレンスを弱める; リファレンスを強める; リファレンスが弱いかどうかを返す。 (弱いリファレンスは、ガベージコレクションの目的では考慮されません; perlref を参照してください。) これらは Scalar::Util にある似たようなルーチンの代わりになります。
これらの関数は、リファレンス(実際には非リファレンスも!)に関する さらなる情報を提供し、Scalar::Util にある似たようなルーチンの 代わりになります。
ceil
は、引数の値以上の最小の整数を返します。 floor
は、引数の値以下の最大の整数を返します。 これらは POSIX にある似たような関数を置き換えられます。
defer
ブロック (実験的このリリースでは、defer
修飾子を前置したコードのブロックである defer
ブロックの対応が追加されました; これらは後で、スコープの終了時に実行されるコード節を提供します。
手短に言うと、実行時に defer
ブロックに到達したとき、 その中身は、囲んでいるスコープが終了したときに実行できるように取って 置かれます。 (他にも理由はありますが) defer
ブロックを 含んでいる ブロックが、 そのブロックに到達する前に終了した場合、実行されない、という点で、 UNITCHECK と異なります。
defer
ブロックは、オブジェクトのデストラクタによって実行される コードブロックを渡される「スコープガード」オブジェクトを 置き換えることができます。
さらなる情報については、"defer blocks" in perlsyn を参照してください。
finally
を使えるようになりました (実験的)実験的な try
/catch
構文は、finally
キーワードで導入される オプションの 3 番目のブロックに対応するように拡張されました。
try {
attempt();
print "Success\n";
}
catch ($e) {
print "Failure\n";
}
finally {
print "This happens regardless\n";
}
これは、try
/catch
構文の最後に、 たとえ例外または制御フローキーワードによって中断されても、 実行するコードを提供します。 これらは defer
ブロックに似ています。
さらなる情報については、"Try Catch Exception Handling" in perlsyn を 参照してください。
Perl は伝統的に文字列/パターンの区切り文字として 4 組だけを 許していました: ( )
, { }
, [ ]
, < >
で、全て ASCII の範囲です。 Unicode にはさらに数百の可能性があり、 この機能を使うことでその多くを有効にします。 有効にすると、例えば qr« »
や use utf8; q𝄃string𝄂
のように できます。 詳しくは "The 'extra_paired_delimiters' feature" in feature を 参照してください。
サブルーチンシグネチャは安定版になったにも関わらず、 シグネチャを持つサブルーチンで伝統的な引数配列 (@_
) を使うのは実験的 のまま で、独自の警告カテゴリを持ちます。 experimental::signatures
警告カテゴリだけでは これを抑制するには不十分です。 新しい警告は experimental::args_array_with_signatures
という カテゴリ名で出力されます。
シグネチャを持っていて、デフォルト引き数配列またはその要素 (@_
または $_[INDEX]
) を、明示的または (引数なしの shift
または pop
のように) 暗黙的に使おうとするサブルーチンは、コンパイル時に警告を発生させます:
use v5.36;
sub f ($x, $y = 123) {
say "The first argument is $_[0]";
}
Use of @_ in array element with signatured subroutine is experimental
at file.pl line 4.
これをしようとするコードの振る舞いはもはや不定で、 将来のバージョンで変わるかもしれません。
@a = sort @empty; # unaffected
@a = sort; # now a compile-time error
@a = sort (); # also a compile-time error
裸のソートは、空リストを作るための奇妙な方法でした; これはコンパイル時に croak するようになりました。 この変更は、将来 sort
で行うかもしれない拡張のために文法上の空きを 作っておくためのものです。
use v5.11
の後での use VERSION
(VERSION は v5.11 より前) は廃止予定ですuse v5.11
以降のスコープ内では、 use vX
の行 (X は v5.11 未満) は警告を出すようになりました:
Downgrading a use VERSION declaration to below v5.11 is deprecated
例えば:
use v5.14;
say "The say statement is permitted";
use v5.8; # This will print a warning
print "We must use print\n";
これは、Perl チームはこの場合の振る舞いを変更する計画があるからです。 Perl v5.12 (および v5.11 の一部) から、 strict は 事前に無効にされていない限り 有効になります。 言い換えると:
no strict;
use v5.12; # will not enable strict, because "no strict" preceded it
$x = 1; # permitted, despite no "my" declaration
将来、この振る舞いは取り除かれ、 use VERSION
は、バージョン v5.12 以降の場合は、常に strict を 有効にします。
この方法でバージョンを混ぜたいコードは、 異なったバージョンの範囲がレキシカルに確実に分離されるように、 ブロック文法をによるレキシカルスコープを使うべきです。
{
use v5.14;
say "The say statement is permitted";
}
{
use v5.8; # No warning is emitted
print "We must use print\n";
}
もちろん、これはおそらくあなたが必要なものではないでしょう! 最初のブロックがコンパイルされると、あなたは perl v5.14.0 以降を 使うということです。
C11 スレッドローカルストレージのコンパイラ対応を調査して、 利用可能な場合は、 スレッド付き Perl ビルドのための API 呼び出しを行う XS 拡張のための「暗黙のコンテキスト」でこれを使います。 これは、POSIX スレッド固有のストレージに比べて、C レベルの関数呼び出しを ほとんど必要としません。 C11 の手法が利用できない場合は pthreads の手法を使い続けます。
デフォルトで実行した Configure は (少し高速な) スレッドなし Perl を ビルドしますが、ほとんどのオペレーティングシステムはスレッド付き Perl を出荷しています。
大きなハッシュに対してはもはや共有文字列テーブルから キーを割り当てないように設定できるようになりました。
次の全てについて同じ内部データ型 (PVHV
) が使われます:
シンボルテーブル
(デフォルトでは) オブジェクト
連想配列
共有文字列テーブルは本来、オブジェクトとして使われる bless されたハッシュの 性能向上のために追加されました; 全てのオブジェクト実体は同じキーを持つので、それらの間でメモリを共有する 最適化があるからです。 これはまた、派生クラスが同じキー (典型的にはメソッド名) を持つ シンボルテーブルにも意味があり、またメソッド呼び出しのために 構築された OP 木もメモリを共有できます。 共有文字列テーブルは、おおまかにはハッシュキーのキャッシュのように 振る舞います。
しかしハッシュについては実際には - キーに値をマッピングする - 連想配列 として 使われます; 典型的にはキーは他のハッシュで再利用されません。 例えば、"seen" ハッシュはオブジェクト ID (またはアドレス) をキーとして使い、 論理的にはこれらのキーは他のハッシュで繰り返されません。
これらの「1 回だけ使う」キーを共有文字列テーブルに保管すると、 利点なしに CPU と RAM の使用量が増加します。 このようなキーに対して、共有文字列テーブルは、ヒット率 0% の キャッシュのように振る舞います。 ここに全てのキーを保存すると、共有文字列テーブルの合計サイズが増加し、 それに連れてサイズ変更する回数も増加します。 さらに悪いことに - (プリフォークサーバのように) 子プロセスのための「コピーオンライト」メモリを持つ環境の場合、 共有文字列テーブルで使われるメモリページは、子プロセスがハッシュを 操作するにつれて急速にコピーする必要性が発生します。 従って、共有文字列テーブルのほとんどが そのような 1 ヶ所でしか使われないキーの場合、 perl インタプリタの中で再利用する利点はなく、 より多くのページを OS がコピーすることによる高いコストがあることになります。
perl インタプリタは、(オブジェクトやシンボルテーブルでない)「大きな」 ハッシュに対して共有ハッシュキーを無効化するように設定できるようになりました。 そうするためには、Configure に -Accflags='-DPERL_USE_UNSHARED_KEYS_IN_LARGE_HASHES'
を追加してください。 「大きな」は発見的です -- 現在の所、 ハッシュへのキーの追加が追加のストレージの割り当てを引き起こし、 ハッシュが 42 以上のキーを持つときに、共有は無効化されます。
これは、同じキーを共有する複数の大きなハッシュを含む (bless されない) データ構造を作るプログラムでは、メモリ使用量が少し増える かもしれません。 しかし一般的に、私たちによるテストは、先に記述した特定の条件では 利点が上回り、それ以外のコードでは影響がないことを示唆しています。
ある種のシナリオでは、新しいスカラの作成は著しく高速なりました。
例えば、次のコードは実行が約 30% 高速になりました:
$str = "A" x 64;
for (0..1_000_000) {
@svs = split //, $str
}
(これに関する詳細は [perl #19414] で読めます。)
Archive::Tar はバージョン 2.38 から 2.40 に更新されました。
Attribute::Handlers はバージョン 1.01 から 1.02 に更新されました。
attributes はバージョン 0.33 から 0.34 に更新されました。
B はバージョン 1.82 から 1.83 に更新されました。
B::Concise はバージョン 1.004 から 1.006 に更新されました。
B::Deparse はバージョン 1.56 から 1.64 に更新されました。
bignum はバージョン 0.51 から 0.65 に更新されました。
charnames はバージョン 1.48 から 1.50 に更新されました。
Compress::Raw::Bzip2 はバージョン 2.101 から 2.103 に更新されました。
Compress::Raw::Zlib はバージョン 2.101 から 2.105 に更新されました。
CPAN はバージョン 2.28 から 2.33 に更新されました。
Data::Dumper はバージョン 2.179 から 2.184 に更新されました。
DB_File はバージョン 1.855 から 1.857 に更新されました。
Devel::Peek はバージョン 1.30 から 1.32 に更新されました。
Devel::PPPort はバージョン 3.62 から 3.68 に更新されました。
diagnostics はバージョン 1.37 から 1.39 に更新されました。
Digest はバージョン 1.19 から 1.20 に更新されました。
DynaLoader はバージョン 1.50 から 1.52 に更新されました。
Encode はバージョン 3.08 から 3.17 に更新されました。
Errno はバージョン 1.33 から 1.36 に更新されました。
experimental はバージョン 0.024 から 0.028 に更新されました。
Exporter はバージョン 5.76 から 5.77 に更新されました。
ExtUtils::MakeMaker はバージョン 7.62 から 7.64 に更新されました。
ExtUtils::Miniperl はバージョン 1.10 から 1.11 に更新されました。
ExtUtils::ParseXS はバージョン 3.43 から 3.45 に更新されました。
ExtUtils::Typemaps はバージョン 3.43 から 3.45 に更新されました。
Fcntl はバージョン 1.14 から 1.15 に更新されました。
feature はバージョン 1.64 から 1.72 に更新されました。
File::Compare はバージョン 1.1006 から 1.1007 に更新されました。
File::Copy はバージョン 2.35 から 2.39 に更新されました。
File::Fetch はバージョン 1.00 から 1.04 に更新されました。
File::Find はバージョン 1.39 から 1.40 に更新されました。
File::Glob はバージョン 1.33 から 1.37 に更新されました。
File::Spec はバージョン 3.80 から 3.84 に更新されました。
File::stat はバージョン 1.09 から 1.12 に更新されました。
FindBin はバージョン 1.52 から 1.53 に更新されました。
GDBM_File はバージョン 1.19 から 1.23 に更新されました。
Hash::Util はバージョン 0.25 から 0.28 に更新されました。
Hash::Util::FieldHash はバージョン 1.21 から 1.26 に更新されました。
HTTP::Tiny はバージョン 0.076 から 0.080 に更新されました。
I18N::Langinfo はバージョン 0.19 から 0.21 に更新されました。
if はバージョン 0.0609 から 0.0610 に更新されました。
IO はバージョン 1.46 から 1.50 に更新されました。
IO-Compress はバージョン 2.102 から 2.106 に更新されました。
IPC::Open3 はバージョン 1.21 から 1.22 に更新されました。
JSON::PP はバージョン 4.06 から 4.07 に更新されました。
libnet はバージョン 3.13 から 3.14 に更新されました。
Locale::Maketext はバージョン 1.29 から 1.31 に更新されました。
Math::BigInt はバージョン 1.999818 から 1.999830 に更新されました。
Math::BigInt::FastCalc はバージョン 0.5009 から 0.5012 に更新されました。
Math::BigRat はバージョン 0.2614 から 0.2621 に更新されました。
Module::CoreList はバージョン 5.20210520 から 5.20220520 に更新されました。
mro はバージョン 1.25_001 から 1.26 に更新されました。
NEXT はバージョン 0.68 から 0.69 に更新されました。
Opcode はバージョン 1.50 から 1.57 に更新されました。
open はバージョン 1.12 から 1.13 に更新されました。
overload はバージョン 1.33 から 1.35 に更新されました。
perlfaq はバージョン 5.20210411 から 5.20210520 に更新されました。
PerlIO はバージョン 1.11 から 1.12 に更新されました。
Pod::Functions はバージョン 1.13 から 1.14 に更新されました。
Pod::Html はバージョン 1.27 から 1.33 に更新されました。
Pod::Simple はバージョン 3.42 から 3.43 に更新されました。
POSIX はバージョン 1.97 から 2.03 に更新されました。
re はバージョン 0.41 から 0.43 に更新されました。
Scalar::Util はバージョン 1.55 から 1.62 に更新されました。
sigtrap はバージョン 1.09 から 1.10 に更新されました。
Socket はバージョン 2.031 から 2.033 に更新されました。
sort はバージョン 2.04 から 2.05 に更新されました。
Storable はバージョン 3.23 から 3.26 に更新されました。
Sys::Hostname はバージョン 1.23 から 1.24 に更新されました。
Test::Harness はバージョン 3.43 から 3.44 に更新されました。
Test::Simple はバージョン 1.302183 から 1.302190 に更新されました。
Text::ParseWords はバージョン 3.30 から 3.31 に更新されました。
Text::Tabs はバージョン 2013.0523 から 2021.0814 に更新されました。
Text::Wrap はバージョン 2013.0523 から 2021.0814 に更新されました。
threads はバージョン 2.26 から 2.27 に更新されました。
threads::shared はバージョン 1.62 から 1.64 に更新されました。
Tie::Handle はバージョン 4.2 から 4.3 に更新されました。
Tie::Hash はバージョン 1.05 から 1.06 に更新されました。
Tie::Scalar はバージョン 1.05 から 1.06 に更新されました。
Tie::SubstrHash はバージョン 1.00 から 1.01 に更新されました。
Time::HiRes はバージョン 1.9767 から 1.9770 に更新されました。
Unicode::Collate はバージョン 1.29 から 1.31 に更新されました。
Unicode::Normalize はバージョン 1.28 から 1.31 に更新されました。
Unicode::UCD はバージョン 0.75 から 0.78 に更新されました。
UNIVERSAL はバージョン 1.13 から 1.14 に更新されました。
version はバージョン 0.9928 から 0.9929 に更新されました。
VMS::Filespec はバージョン 1.12 から 1.13 に更新されました。
VMS::Stdio はバージョン 2.45 から 2.46 に更新されました。
warnings はバージョン 1.51 から 1.58 に更新されました。
Win32 はバージョン 0.57 から 0.59 に更新されました。
XS::APItest はバージョン 1.16 から 1.22 に更新されました。
XS::Typemap はバージョン 0.18 から 0.19 に更新されました。
XSLoader はバージョン 0.30 から 0.31 に更新されました。
この文書は、Perl Core Team の中での選挙や投票を運営する手続きを 提供しています。
私たちはこの文書で挙げられた変更を反映するように文書を更新しようとしています。 もし抜けている物を発見したら、 https://github.com/Perl/perl5/issues でイシューを開いてください。
それに加えて、以下のような変更が行われました。
いくつかの整理が行われ、(以前はたくさんあった) 文書化されていない関数の 80% 以上について、文書化されたか、不適切に API とされていたと みなすかが行われました。
いつも通り、パッチを歓迎します!
もはやコアの外側で使われることを想定していないため、Pod::Html から Pod::Html::Util に移動した関数の新しい位置について記しました。
:win32
IO 疑似層が削除されたこと (これは 5.35.2 で起きました) を 記しました。
選挙手続きは、立候補者数が定数を超えない場合に投票を省略できるように 微調整されました。
特別投票は、最大 12 週間、例えば通常投票まで延期できることになりました。
呼び出し元は、メソッド呼び出しの場合にのみオブジェクトまたは クラス名である必要があり、サブルーチンリファレンスではそうでないことを 記しました。
/d 正規表現修飾子の使用を非推奨にするように更新しました。
-? は -h の同義語になりました
-g は -0777 の同義語になりました
次のような追加と変更が、警告や致命的エラーメッセージを含む診断出力に 行われました。 診断メッセージの完全な一覧については、perldiag を参照してください。
Can't "%s" out of a "defer" block
(F) return
, goto
やループ制御のようなフロー制御文を使って、 遅延ブロックのスコープから飛び出そうとしました。 これは許されていません。
Can't modify %s in %s (for scalar assignment to undef
)
undef = $foo;
のように、undef
にスカラを代入しようとしました; これは以前は "Modification of a read-only value attempted" という致命的な実行時エラーを引き起こしていました。 このような代入の試行を実行時の前に検出するのはより有用なので、 これはコンパイル時エラーになり、 "Can't modify undef operator in scalar assignment" という メッセージなりました。
パーサは、foreach
ループをパースしようとしている間の内部一貫性チェックに 失敗しました。
Built-in function '%s' is experimental
builtin::
名前空間の関数を呼び出しました; これは現在の所実験的です。
The defer
ブロック修飾子は実験的です。 この機能を使いたいけれども、そうすることで将来の Perl バージョンで 変更されるかもしれない実験的機能を使うリスクを取ることを分かっている場合は、 no warnings 'experimental::defer'
で警告を無効にしてください。
Downgrading a use VERSION declaration to below v5.11 is deprecated
この警告は、(use strict
が有効のとき) 先により大きい値で宣言した後、 (use strict
が無効のとき) v5.11 より小さいバージョンを要求する use VERSION
文で出力されます。
この警告は、一度に複数の値を繰り返すために for
を使うと発生します。 この文法は現在の所実験的で、その振る舞いは将来のリリースの Perl で 変更されるかもしれません。
Implicit use of @_ in %s with signatured subroutine is experimental
暗黙に @_
引数に関連する式が、シグネチャを使うサブルーチン内に 見つかりました。
Use of @_ in %s with signatured subroutine is experimental
@_
引数配列に関係する式が、シグネチャを使っているサブルーチンの中で 見つかりました。
プログラム名 ($0
) にワイド文字を入れようとすると、 この警告が出るようになりました。
'/' does not take a repeat count in %s
この警告は、in %s
を含んでいませんでした。
ローカル化されたサブルーチンの再定義は、もはやこの警告を 引き起こさなくなりました。
unexpected constant lvalue entersub entry via type/targ %d:%d" now has a panic prefix
これは、サブルーチンをコンパイルするときのその他の内部一貫性のチェックと 一貫性を持つようになりました。
Useless use of sort in scalar context is now in the new scalar
category.
sort
がスカラコンテキストで使われると、 そうすることは役に立たないという警告が発生します。 この警告は void
カテゴリにありました。 scalar
という名前の、スカラコンテキストに関する新しい警告が 追加されました。
多くの診断メッセージを削除
何年間にもわたって perl コアから削除されてきた多くの診断メッセージが、 文書 からも 削除されました。
Perl C ソースコードは、私たちがターゲットとしている全てのコンパイラが 対応していることが確認されたいくつかの C99 機能を使うようになりました。 つまり、Perl のヘッダは C99 では正当だけれども C89 では正当でない コードを含むようになりました。
これは、gcc や clang でコンパイルするときに -Werror=declaration-after-statement
を無条件に C コンパイラフラグに 追加している、一部の XS モジュールで問題を引き起こすかもしれません。 初期のバージョンの Perl は、ある種の C99 の機能、 特に宣言とコードの混合を厳密に拒否するとても古いコンパイラに 対応していたので、 XS モジュール作者にとって、自分のコードがこれに違反していないかを 検査することには意味があります。 しかし、そうすることはこれらの初期のバージョンの Perl でのみ可能なので、 それらのモジュールはこのフラグを <$] < 5.035005
> の場合でのみ 追加するように変更する必要があります。
makedepend のステップは make を使うことで並列に実行されるようになりました
MAKEFLAGS=-j8 を使うと、次のものに必要な時間が大幅に削減されます:
sh ./makedepend MAKE=make cflags
Configure は、POSIX 1003 のスレッドセーフなロケール関数や 関連する拡張を使うのに #include <xlocale.h>
が必要かどうかを テストするようになりました。 ライブラリ更新で非公式の xlocale.h が削除されたり、 xlocale.h が公的な使用を想定していない場合の問題を防ぎます。 (github #18936)
このリリースのその他の追加と変更を反映してテストが追加、変更されました。
古い MSVC++ (VC12 以前) の対応が削除されました
これらは C99 に対応していないので、もはや perl をコンパイルするのには 使えません。
(Visual C++ 14.3 を含む) Microsoft Visual Studio 2022 を 使った Windows での perl のコンパイルへの対応が追加されました。
:win32 IO 層が削除されました。 この実験的な :unix 層の置換物は、約 20 年存在していた間にも 成熟することはありませんでした。
keys %ENV
on VMS returns consistent resultsVMS では、%ENV
ハッシュのエントリは 最初のアクセスで OS 環境から読み込まれるので、 %ENV
の最初の反復は、全ての可能なキーを見つけるために環境変数全体が スキャンされる必要がありました。 この初期化は完全な反復では常に正しく行われていましたが、 以前はスカラコンテキストでの %ENV
では起きていなかったので、 scalar %ENV
とすると、それより前に %ENV
アクセスがないと 0 を返し、 反復がない場合、アクセスされたキーの数だけを返していました。
これらのバグは修正されました; スカラコンテキストでの %ENV
と keys %ENV
は正しい結果、つまり環境変数の全てのキーの数を 返すようになりました。
UWIN は Windows のための UNIX 互換層です。 最後のリリースは 2012 年で、最近は Cygwin に置き換えられています。
DJGPP は、DOS で動作する 32-bit x86 システムへの GNU ツールチェーンの移植です。 最後に知られている、ここで Perl をビルドしようとする試みは 5.20 に 対してのもので、miniperl をビルドしただけでした。
Novell NetWare の対応コードは削除されました。 NetWare は Novell によるサーバオペレーティングシステムです。 この移植版が最後に更新されたのは 2002 年 7 月で、 プラットフォーム自体も 2009 年 5 月です。
2009 年 9 月に、無関係な変更が偶然 NetWare でのビルドを壊していましたが、 12 年間誰もこれを報告しませんでした。
この更新では、EBCDIC 静的/動的と 31 ビット/64 ビットアドレッシング モードの Perl をビルドできるようになりました。 通過するテストの数は、これらの更新の前の基準と一貫しています。
これらの変更は、ASCII 静的/動的と 31 ビット/64 ビットアドレッシング モードの Perl を提供できる基本的な機能を提供します。
(以前は OS/390 と呼ばれていた) z/OS の README は、 ASCII ビルドと EBCDIC ビルドを記述するために更新されました。
Perl 5.8 での PERL_OBJECT の削除以降、PERL_IMPLICIT_CONTEXT と MULTIPLICITY は同義語で、互いに交換可能になっていました。 コードの単純化のために、全ての PERL_IMPLICIT_CONTEXT は MULTIPLICITY に置き換えられました。
XS モジュールの互換性のために、PERL_IMPLICIT_CONTEXT も定義されたままです。
リストコンテキストを示すための、以前は G_ARRAY
という名前だった API 定数は、より正確な G_LIST
に名前が変更されました。 既存のコードが影響なく動作できるようにするために、 互換性のためのマクロ G_ARRAY
が追加されました。 しかし、新しいコードは新しい定数を使って書かれるべきです。 これは Devel::PPPort
バージョン 3.63 で対応されました。
バージョン比較を助けるためのマクロが perl.h に追加されました: PERL_GCC_VERSION_GE
, PERL_GCC_VERSION_GT
, PERL_GCC_VERSION_LE
, PERL_GCC_VERSION_LT
。
ワードの中の最下位の 1 のビットの位置を決定するためのインライン関数が embed.h に追加されました: lsbit_pos32
と lsbit_pos64
。
Perl_ptr_table_clear
は削除されました。 これは (2011 年リリースの) v5.14.0 から廃止予定とされていて、 CPAN で使っているコードはありません。
新しいブール値マクロと関数が追加されました。 関連する情報については "Stable boolean tracking" を、 文書については perlapi を参照してください。
sv_setbool
sv_setbool_mg
SvIsBOOL
RVs を扱うための四つの不足していた関数が追加されました:
sv_setrv_noinc
sv_setrv_noinc_mg
sv_setrv_inc
sv_setrv_inc_mg
xs_handshake()
の二つの失敗モードは、異なるメッセージを 出力するようになりました。
ハッシュ反復子状態 (struct xpvhv_aux
) のメモリは、 メインハッシュ配列のために割り当てられたメモリブロックの一部ではなく、 ハッシュ本体の一部として割り当てられるようになりました。
新しい phase_name() インターフェースは、それぞれのインタプリタフェーズの 名前 (つまり PL_phase の値) へのアクセスを提供します。
pack
の U
の振る舞いは EBCDIC で変更されました。
新しい等価性テスト関数である sv_numeq
と sv_streq
が、 ..._flags
接尾辞付きの変種と共に追加されました。 これらは、演算子オーバーロードを考慮に入れた数値比較および文字列比較を行う 簡単で一貫性のある API を公開します。
整数値の文字列形式を読み込んでも、もはや SVf_POK
フラグを 設定しなくなりました。 文字列形式は内部ではキャッシュされるままで、 SvPV(sv)
などのマクロ (C 関数を呼び出さないマクロ) によって 直接再読込されるままです。 値を得るために既に API を呼び出している XS コードは、 この変更の影響を受けません。 API を使わずにフラグに直接アクセスしている XS コードは、壊れる かもしれません が、そのようなコードはおそらく既に、文字列 オーバーロードされた浮動小数点数やオブジェクトのようなその他の値を渡すと バグがあります。
この小さい変更は (JSON 直列化器のような) コードが、次のものを 安定して決定できるようになります:
最初に整数として 書き込み されたけれども、その後文字列として 読み込み された値:
my $answer = 42;
print "The answer is $answer\n";
最初に文字列として 書き込み されたけれども、その後整数として 読み込み された同じ値:
my $answer = "42";
print "That doesn't look right\n"
unless $answer == 6 * 9;
最初の場合 (最初に整数として書き込まれた場合)、次のようになります:
use Devel::Peek;
my $answer = 42;
Dump ($answer);
my $void = "$answer";
print STDERR "\n";
Dump($answer)
SV = IV(0x562538925778) at 0x562538925788
REFCNT = 1
FLAGS = (IOK,pIOK)
IV = 42
SV = PVIV(0x5625389263c0) at 0x562538925788
REFCNT = 1
FLAGS = (IOK,pIOK,pPOK)
IV = 42
PV = 0x562538919b50 "42"\0
CUR = 2
LEN = 10
2 番目の場合 (最初に文字列として書き込まれた場合)、次のようになります:
use Devel::Peek;
my $answer = "42";
Dump ($answer);
my $void = $answer == 6 * 9;
print STDERR "\n";
Dump($answer)'
SV = PV(0x5586ffe9bfb0) at 0x5586ffec0788
REFCNT = 1
FLAGS = (POK,IsCOW,pPOK)
PV = 0x5586ffee7fd0 "42"\0
CUR = 2
LEN = 10
COW_REFCNT = 1
SV = PVIV(0x5586ffec13c0) at 0x5586ffec0788
REFCNT = 1
FLAGS = (IOK,POK,IsCOW,pIOK,pPOK)
IV = 42
PV = 0x5586ffee7fd0 "42"\0
CUR = 2
LEN = 10
COW_REFCNT = 1
(スカラの操作の履歴を決定するために、 SVf_IsCOW
の有無に依存することはできません。)
以前はどちらの場合でも四つ全てのフラグが設定されるので、 区別できませんでした:
SV = PVIV(0x55d4d62edaf0) at 0x55d4d62f0930
REFCNT = 1
FLAGS = (IOK,POK,pIOK,pPOK)
IV = 42
PV = 0x55d4d62e1740 "42"\0
CUR = 2
LEN = 10
(そして SVf_IsCOW
があるかもしれませんが常にではありません)
つまり、ある値が最初にどの形式で書かれたかを決定する必要が 本当に あるなら、これはおおよそ次のようなロジックを実装するべきです:
if (flags & SVf_IOK|SVf_NOK) && !(flags & SVf_POK)
serialize as number
else if (flags & SVf_POK)
serialize as string
else
the existing guesswork ...
これは「二重変数」 (($!
のような)文字列形式と数値形式で異なる値を報告するスカラ) には 対応していないことに注意してください。 ほとんどの直列化は、そのような二重性を表現できません。
二重変数の他にも、値は undef
、リファレンス、オーバーロードされた リファレンス、型グロブなど、Perl 自身は表現できるけれども、 外部形式に 1 対 1 でマッピングできないものかもしれないので、 既存の推量 は残っています; 従って、 ある程度の近似やカプセル化が必要です。
sv_dump
(および Devel::Peek の Dump
関数) は、 PV の高位ビットオクテットを 8 進数ではなく 16 進数として エスケープするようになりました。 ほとんどの人は 8 進数より 16 進数の方が素早く理解できるので、 これによりダンプが少し読みやすくなったはずです。 これは pv_display
のようなその他の診断インターフェースには 影響 しません。
utime() は、閉じたハンドルに対して呼び出されたときに 正しく errno/$!
を設定するようになりました。
setsockopt() の OPTVAL 引数のフラグは、 マジックが呼び出される前にチェックされていたので、 数値が pack されたバッファ、あるいはその逆として扱われることがありました。 これはまた UTF-8 フラグを無視していたので、 昇格された SV の内部表現を setsockopt() システムコールに渡す バイト列として扱うことがありました。 (github #18660)
$) と $( は IOK ではなく IOKp のみを設定するようになりました。 これは #18955 です: これは直列化器がこれらの変数を (追加のグループが失われる) 数値として 直列化するのを防ぎます。 これは 5.16 の振る舞いを復元します。
mktables
デバッグ機能を使うと、v5.31.10 から perl に croak を 引き起こしていました; この問題は修正されました。
makedepend
のロジックは BSD make と互換性があるようになりました (GH #19046 を修正しました)。
反復の途中の tie されたハッシュに対して untie
を呼び出すと、 反復状態を直ちに解放するようになりました。
tie されたハッシュを反復すると、 perl は、反復状態を追跡するために現在のハッシュキーのコピーを保管します; この保管されたコピーは NEXTKEY
への 2 番目の引数として渡されます。 この内部状態は、tie されたハッシュの反復が完了するか、 ハッシュが破壊された直後に解放されます; しかし、実装のミスにより、ハッシュが untie された場合には 解放されていませんでした。 この場合、キーの内部コピーは、次のものの中で一番早い時点まで 維持されます:
tie
が同じハッシュに対して再び呼び出された
(untie された) ハッシュが反復された (つまり、keys
, values
, each
のいずれかに渡された)。
ハッシュが破壊された。
この非一貫性は修正されました - 内部状態は untie
の直後に解放されるようになりました。
この振る舞いの正確なタイミングは、 (FIRSTKEY
と NEXTKEY
から返されたオブジェクトの DESTROY
の タイミング) ピュア Perl コードで観測できます; コードによってはこれを検出することが可能というだけです。
perl 5.30.0 で miniperl をブートストラッピングするために追加された The Internals::getcwd()
関数は、miniperl でのみ利用可能になりました。 [github #19122]
BEGIN や等価な use
文にブレークポイントを設定すると、 解放された dbstate
op へのメモリ書き込みを引き起こすことがありました。 [GH #19198]
裸の単語のファイルハンドルが無効のとき、パーサは、たとえかっこが 引き続いていても、全ての裸の単語をファイルハンドルとして解釈していました。
perl5300delta は CVE の識別子を誤っていました; 正しい識別子は CVE-2015-1592 です。
1996 年から 2002 年の間に少なくとも 66 コミットを Perl 5 コア配布に行った Raun "Spider" Boardman (CPAN では SPIDB) は、2021 年 5 月 24 日に COVID の 合併症で亡くなりました。 お悔やみ申し上げます。
David H. Adler (DHA) は 2021 年 11 月 16 日に亡くなりました。 1997 年、David は最初の Perl ユーザーグループである NY.pm を共同設立し、 1998 年には、世界中のその他のユーザーグループの設立を助ける Perl Mongers を共同設立しました。 彼は北米とヨーロッパの両方の Perl conference に頻繁に出席し、 それらのカンファレンスでの Bad Movie Night 式典の主催者として よく知られていました。 彼はまた、コミュニティ貢献に対する White Camel 賞の運営を含む貢献を Perl Foundation にしていました。 お悔やみ申し上げます。
Perl 5.36.0 は、Perl 5.34.0 以降、82 人の作者によって、 2,000 のファイルに約 250,000 行の変更を加えて、 約 1 年間開発されてきました。
自動生成ファイル、文書、リリースツールを除くと、1,300 の .pm, .t, .c, .h ファイルに約 190,000 行の変更を加えました。
Perl は、活気のあるユーザーと開発者のコミュニティのおかげで 30 年を超えて 繁栄しています。 以下の人々が、Perl 5.36.0 になるための改良に貢献したことが分かっています:
Alyssa Ross, Andrew Fresh, Aristotle Pagaltzis, Asher Mancinelli, Atsushi Sugawara, Ben Cornett, Bernd, Biswapriyo Nath, Brad Barden, Bram, Branislav Zahradník, brian d foy, Chad Granum, Chris 'BinGOs' Williams, Christian Walde (Mithaldu), Christopher Yeleighton, Craig A. Berry, cuishuang, Curtis Poe, Dagfinn Ilmari Mannsåker, Dan Book, Daniel Laügt, Dan Jacobson, Dan Kogai, Dave Cross, Dave Lambley, David Cantrell, David Golden, David Marshall, David Mitchell, E. Choroba, Eugen Konkov, Felipe Gasper, François Perrad, Graham Knop, H.Merijn Brand, Hugo van der Sanden, Ilya Sashcheka, Ivan Panchenko, Jakub Wilk, James E Keenan, James Raspass, Karen Etheridge, Karl Williamson, Leam Hall, Leon Timmermans, Magnus Woldrich, Matthew Horsfall, Max Maischein, Michael G Schwern, Michiel Beijen, Mike Fulton, Neil Bowers, Nicholas Clark, Nicolas R, Niyas Sait, Olaf Alders, Paul Evans, Paul Marquess, Petar-Kaleychev, Pete Houston, Renee Baecker, Ricardo Signes, Richard Leach, Robert Rothenberg, Sawyer X, Scott Baker, Sergey Poznyakoff, Sergey Zhmylove, Sisyphus, Slaven Rezic, Steve Hay, Sven Kirmess, TAKAI Kousuke, Thibault Duponchelle, Todd Rinaldo, Tomasz Konojacki, Tomoyuki Sadahiro, Tony Cook, Unicode Consortium, 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 ファイル。