class
機能defer
や finally
から離れる禁止された制御フローはコンパイル時に検出されるようになりましたdefer
と finally
ブロックの中の一部の goto
が許されるようになりましたperl5380delta - perl v5.38.0 での変更点
この文書は 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';
詳しくは https://www.unicode.org/versions/Unicode15.0.0/ を 参照してください。
全ての廃止予定警告は、個別に無効化できるように、それぞれ固有の 廃止予定カテゴリを持つようになりました。 全ての廃止予定機能の一覧は perldeprecation と warnings にあります。 次の一覧は 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;
様々な理由により、いくつかの perl のキーワードのラッパサブルーチンを 作るのは難しいことがありました。 プロトタイプが未定義のキーワードは単にサブルーチンで ラッピングすることができず、perl がラッピングされることを許している いくつかのキーワードは実際にはラッピングするのが非常にトリッキーです。 例えば require
はラッピングするのがトリッキーで、 可能ではありますが、そうするとスタックの深さが変わり、 エクスポートの標準手法は、パッケージをスタック上のあるスタックの深さに エクスポートすることを仮定しているので、ラッパは、非常に 注意して実装されない限り、関数がエクスポートされる場所を 変更します。 これは非常に扱いにくいです。
従って、私たちはこのような状況を手助けすることを意図した、 %{^HOOK}
と呼ばれる新しいハッシュを導入しました。 あるキーワードが特殊フックに対応すると、 フックはこの新しいハッシュの中で有効になります。 このハッシュのフックは、これらが呼ぶ関数の名前、 二つの下線、それが実行されるフェーズ(現在は "before" か "after") からなる名前がつきます。
この初期リリースでは、二つのフック require__before
と require__after
に対応しています。 これらは、require 文の前後で処理を実行するのを容易にします。
さらなる詳細については perlvar を参照してください。
srand()
を使わずに rand
を使ったり、引数なしの srand()
を 使う perl プログラムを再現可能にするために使われる、 新しい環境変数 PERL_RAND_SEED
が追加されました。 perlrun を参照してください。 この機能はコンパイル時に無効にできます; 次のものを:
-Accflags=-DNO_PERL_RAND_SEED
ビルド中に Configure に渡します。
サブルーチンシグネチャ引数のデフォルト式は、 単に引数が完全に省略されるのではなく、 呼び出し元が未定義値は偽の値を指定したときのデフォルトを適用するために、 (それぞれ) //=
や ||=
の演算子を使って代入できるようになりました。 さらなる詳細については perlsub の文書を参照してください。
@INC
フックの内部は、さまざまなエッジケースを扱うために強化され、 また、フックが require 操作の間に @INC
を修正しても セグメンテーションフォルトや例外を発生させなくなりました。 この一部として、全ての指定されたフックは require 呼び出しの間に 最大 1 回しか実行されなくなり、重複したディレクトリが 追加のディレクトリ検査を引き起こさなくなりました。
開発者が動的なモジュール検索をさらに制御できるように、 新しいフックメソッド INCDIR
に対応しました。 このメソッドに対応しているオブジェクトは @INC
配列に注入でき、 モジュール検索プロセスに遭遇したとき、INC フックが実行されるのと 同様に実行されます。 その返り値はモジュールを検索するためのディレクトリのリストとして使われます。 空リストを返すと、何もしません。 このフックによって返されるリファレンスは文字列化されて文字列として 使われるので、この API 経由で後で実行されるフックを 返してはいけないことに注意してください。
require の間に @INC
フック (INC
か INCDIR
のどちらか) が 呼び出されると、$INC
変数は、 フックが来た @INC
の添え字の値にローカル化されます。 フックが @INC
の「次の」添え字に来るものを上書きしたい場合、 $INC
を目的の添え字から 1 を引いたものに更新できます (undef
は -1
と等価です)。 これにより @INC
フックは、完全に @INC
配列を書き換えて、 perl に @INC
の先頭からディレクトリ検索を再出発させるように することができます。
INC
や INCDIR
メソッドに対応していない @INC
の中の bless された CODE は、もはや例外を引き起こさず、 bless されていないコードリファレンスと同じように扱いますが、 INC
フックとして実行されます。
defer
や finally
から離れる禁止された制御フローはコンパイル時に検出されるようになりましたreturn
or goto
のような制御フローで defer
や finally
ブロックから離れようとすることは許されていません。 以前のバージョンの perl では、実際に実行時に試みた時点でのみ これを検出できました。
このバージョンの perl では、静的に決定できる多くの場合での コンパイル時検出が追加されました。 これは、以前のバージョンの perl でコンパイルに成功していたコードが、 このバージョンではコンパイル時エラーとして 報告されるかもしれないということです。 これは、どちらにしろ実際にコードを実行したときにエラーになる場合にのみ 起こります; エラーは単に早く起きるだけです。
パターン中の (?{ ... })
と (??{ ... })
を使うと、 このパターン全体での様々な最適化を無効にします。 これはプログラマが望んたことかもしれませんし違うかもしれません。 このリリースでは等価な (*{ ... })
が追加されました。 唯一の違いは、正規表現エンジンの最適化が決して無効化されないことです。 将来呼び出される回数が増えたり減ったりするかもしれないという意味では より不安定になるかもしれませんが、 実行される回数は正規表現エンジンが動作する回数と正確に一致します。 例えば、ある種の最適化は、(?{ ... })
がパターンに含まれているときに 無効化されるので、通常の使用では O(N) のパターンが、 (?{ ... })
パターンを含むと O(N*N) になります。 (*{ ... })
に切り替えると、パターンは O(N) のままになります。
以前は、多くの正規表現量指定子は U16_MAX
に制限されていましたが、 制限は I32_MAX
になりました; 従って、例えば /(?:word){1000000}/
と書けるようになりました。 こうすると正規表現エンジンの実行時間が長くなり、消費メモリが 増えることに注意してください。
(カスタム LOGOP を作成するときなど) 通常起動されないかもしれない、 op 木生成処理の必要な部分を確実に起動する、 op 木要素を操作するための二つの新しい API 関数があります。 これらの関数にアクセスするためには、まずこれらの関数を使うことを オプトインするための #define
を設定する必要があります。
#define PERL_USE_VOLATILE_API
これらの関数は、インタプリタがどのように動作するかの内部に 強く結びついていて、必要に応じて内部が変更されたときにいつでも 変更または削除される可能性があります。
defer
と finally
ブロックの中の一部の 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";
}
これは、現在のスコープで最後にマッチングに成功したパターンに アクセスできるようにします。 正規表現の多くの要素は「最後に成功したパターン」を参照します。 空パターンはこれを再利用し、全てのマジカル正規表現変数は これに関わります。 これはこのパターンにアクセスできるようにします。 以下のコードは:
if (m/foo/ || m/bar/) {
s//PQR/;
}
次のように書き直せます:
if (m/foo/ || m/bar/) {
s/${^LAST_SUCCESSFUL_PATTERN}/PQR/;
}
そしてこれは正確に同じ事です。
GNU 拡張の LC_NAME
カテゴリがあるプラットフォームでは、 このロケールを設定あるいは問い合わせするための "setlocale" in POSIX のカテゴリ引数として、これを使えるようになりました。
readline()
(<>
とも書けます) は、ストリームに対してエラーが 発生した後、ハンドルのエラーと eof フラグをクリアしていました。
ほぼ全ての場合で、このクリアはもはや行われないので、 エラーと eof フラグは readline() の後のストリームの状態を 適切に反映するようになりました。
エラーフラグは、失敗するかも知れない、明示的に閉じられていない ストリームに対する close() の呼び出しでもはや クリアされないので、ストリームを暗黙に閉じると 警告が出るかもしれません。
これは下流の CPAN モジュールに 2 種類の問題を引き起こし、 これらはあなたのコードにも起きるかもしれません:
コードがファイル終端を読み込み、それからハンドルを 新しいファイル記述子に再設定した場合、以前は eof フラグは 設定されていないのでストリームから読み込み続けることができました。 読み込み続けるためには $handle->clearerr()
によって 自分で eof フラグをクリアする必要があるようになりました。
readline() での読み込み中にストリームにエラーが発生した場合、 読み込み続けるために $handle->clearerr
を呼び出す必要があります。 これが起きる場合の一つは、基になっているファイル記述子が 非ブロッキングとしてマークされていることで、 それにより read() システムコールが EAGAIN
で失敗し、ストリームで エラーフラグが設定されます。
エラー時にエラーと eof フラグがクリアされる唯一の場合は、 miniperl の glob() のための子プロセスから読み込む場合です。 これにより、close() 時の子プロセスからのエラーを正しく報告できます。 これが通常の perl 開発の間に問題になることは考えにくいです。
INIT
ブロックはもはや BEGIN
内の exit()
の後で実行されなくなりましたINIT
ブロックはもはや、 BEGIN
の内側の exit()
の処理後に実行されなくなりました。 つまり、-v
オプションと -c
オプションの組み合わせで、もはや perl バージョンの表示しながらコンパイルチェックを実行しなくなりました。 -v
オプションは BEGIN
ブロックの中でバージョンを表示した後 exit(0) を実行し、-c
のチェックは INIT
フックを使って 実装されているので、-v
オプションが優先されます。
一般的には、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" 機能と、スマートマッチング演算子 ~~
は、v5.10 で導入されました。 これらの振る舞いは v5.10.1 で大きく変更されました。 「実験的」制度が v5.18.0 で追加されたとき、 switch とスマートマッチングは、遡及的に実験的と宣言されました。 長年にわたって、機能を修正または補完する提案が現れては消えていきました。
v5.38.0 で、私達はこの実験が失敗であると宣言しました。 何らかの将来のシステムがスマートマッチングの概念的な代わりと なるかもしれませんが、まだ設計されたりビルドされたりはしていません。
これらの機能は、v5.42.0 に perl から完全に削除される予定です。
一般的な OP パターンに対する追加の op 木最適化。 例えば、複数の単純な OP は一つの効率化された OP に置き換えられるので、 実行時により効率的になります。 [GH #19943], [GH #20063], [GH #20077]。
無名サブルーチンを作成してももはや srefgen
op を生成せず、 リファレンスの作成は anoncode
または anonconst
op で 行われるようになり、実行時間を節約します。 [GH #20290]
is_tainted()
組み込み関数が追加されました。 [GH #19854]
PPC 0018 に対応するために、 use feature "module_true";
は、 v5.38 以降のデフォルト機能の束として追加されました。 これはまた明示的にも使われます。 モジュールの内部で有効のとき、 モジュールは明示的に真を返す必要はなく、実際には、 元々何を返したかに関わらず、単純な真の値を返すことを強制します。
Attribute::Handlers はバージョン 1.02 から 1.03 に更新されました。
attributes はバージョン 0.34 から 0.35 に更新されました。
autodie はバージョン 2.34 から 2.36 に更新されました。
B はバージョン 1.83 から 1.88 に更新されました。
B::Concise はバージョン 1.006 から 1.007 に更新されました。
B::Deparse はバージョン 1.64 から 1.74 に更新されました。
Benchmark はバージョン 1.23 から 1.24 に更新されました。
bignum はバージョン 0.65 から 0.66 に更新されました。
Carp はバージョン 1.52 から 1.54 に更新されました。
Class::Struct はバージョン 0.66 から 0.68 に更新されました。
Compress::Raw::Bzip2 はバージョン 2.103 から 2.204_001 に更新されました。
Compress::Raw::Zlib はバージョン 2.105 から 2.204_001 に更新されました。
Config::Perl::V はバージョン 0.33 から 0.36 に更新されました。
CPAN はバージョン 2.33 から 2.36 に更新されました。
Data::Dumper はバージョン 2.184 から 2.188 に更新されました。
DB_File はバージョン 1.857 から 1.858 に更新されました。
Devel::Peek はバージョン 1.32 から 1.33 に更新されました。
Devel::PPPort はバージョン 3.68 から 3.71 に更新されました。
Digest::MD5 はバージョン 2.58 から 2.58_01 に更新されました。
Digest::SHA はバージョン 6.02 から 6.04 に更新されました。
DynaLoader はバージョン 1.52 から 1.54 に更新されました。
Encode はバージョン 3.17 から 3.19 に更新されました。
encoding::warnings はバージョン 0.13 から 0.14 に更新されました。
Env はバージョン 1.05 から 1.06 に更新されました。
Errno はバージョン 1.36 から 1.37 に更新されました。
experimental はバージョン 0.028 から 0.031 に更新されました。
ExtUtils::CBuilder はバージョン 0.280236 から 0.280238 に更新されました。
ExtUtils::Install はバージョン 2.20 から 2.22 に更新されました。
ExtUtils::MakeMaker はバージョン 7.64 から 7.70 に更新されました。
ExtUtils::Miniperl はバージョン 1.11 から 1.13 に更新されました。
ExtUtils::ParseXS はバージョン 3.45 から 3.51 に更新されました。
ExtUtils::PL2Bat はバージョン 0.004 から 0.005 に更新されました。
ExtUtils::Typemaps はバージョン 3.45 から 3.51 に更新されました。
feature はバージョン 1.72 から 1.82 に更新されました。
File::Basename はバージョン 2.85 から 2.86 に更新されました。
File::Copy はバージョン 2.39 から 2.41 に更新されました。
File::Find はバージョン 1.40 から 1.43 に更新されました。
File::Glob はバージョン 1.37 から 1.40 に更新されました。
File::Spec はバージョン 3.84 から 3.89 に更新されました。
File::stat はバージョン 1.12 から 1.13 に更新されました。
FileHandle はバージョン 2.03 から 2.05 に更新されました。
Filter::Util::Call はバージョン 1.60 から 1.64 に更新されました。
GDBM_File はバージョン 1.23 から 1.24 に更新されました。
Getopt::Long はバージョン 2.52 から 2.54 に更新されました。
Hash::Util はバージョン 0.28 から 0.30 に更新されました。
HTTP::Tiny はバージョン 0.080 から 0.083 に更新されました。
I18N::Langinfo はバージョン 0.21 から 0.22 に更新されました。
IO はバージョン 1.50 から 1.52 に更新されました。
IO-Compress はバージョン 2.106 から 2.204 に更新されました。
IO::Socket::IP はバージョン 0.41 から 0.41_01 に更新されました。
DragonflyBSD で、setsockopt() が成功を返しても 実際には IPV6_V6ONLY
をクリアしていないことを検出します。 [cpan#148293]
IO::Zlib はバージョン 1.11 から 1.14 に更新されました。
JSON::PP はバージョン 4.07 から 4.16 に更新されました。
libnet はバージョン 3.14 から 3.15 に更新されました。
Locale::Maketext はバージョン 1.31 から 1.33 に更新されました。
Math::BigInt はバージョン 1.999830 から 1.999837 に更新されました。
Math::BigInt::FastCalc はバージョン 0.5012 から 0.5013 に更新されました。
Math::BigRat はバージョン 0.2621 から 0.2624 に更新されました。
Math::Complex はバージョン 1.5902 から 1.62 に更新されました。
Memoize はバージョン 1.03_01 から 1.16 に更新されました。
MIME::Base64 はバージョン 3.16 から 3.16_01 に更新されました。
Module::CoreList はバージョン 5.20220520 から 5.20230520 に更新されました。
mro はバージョン 1.26 から 1.28 に更新されました。
NDBM_File はバージョン 1.15 から 1.16 に更新されました。
Net::Ping はバージョン 2.74 から 2.76 に更新されました。
ODBM_File はバージョン 1.17 から 1.18 に更新されました。
Opcode はバージョン 1.57 から 1.64 に更新されました。
overload はバージョン 1.35 から 1.37 に更新されました。
parent はバージョン 0.238 から 0.241 に更新されました。
PerlIO::via::QuotedPrint はバージョン 0.09 から 0.10 に更新されました。
Pod::Checker はバージョン 1.74 から 1.75 に更新されました。
Pod::Html はバージョン 1.33 から 1.34 に更新されました。
Pod::Usage はバージョン 2.01 から 2.03 に更新されました。
podlators はバージョン 4.14 から 5.01 に更新されました。
POSIX はバージョン 2.03 から 2.13 に更新されました。
re はバージョン 0.43 から 0.44 に更新されました。
Safe はバージョン 2.43 から 2.44 に更新されました。
Scalar::Util はバージョン 1.62 から 1.63 に更新されました。
SDBM_File はバージョン 1.15 から 1.17 に更新されました。
Socket はバージョン 2.033 から 2.036 に更新されました。
Storable はバージョン 3.26 から 3.32 に更新されました。
Sys::Hostname はバージョン 1.24 から 1.25 に更新されました。
Term::Cap はバージョン 1.17 から 1.18 に更新されました。
Test::Simple はバージョン 1.302190 から 1.302194 に更新されました。
Text::Balanced はバージョン 2.04 から 2.06 に更新されました。
threads はバージョン 2.27 から 2.36 に更新されました。
threads::shared はバージョン 1.64 から 1.68 に更新されました。
Tie::File はバージョン 1.06 から 1.07 に更新されました。
Time::HiRes はバージョン 1.9770 から 1.9775 に更新されました。
Time::Piece はバージョン 1.3401 から 1.3401_01 に更新されました。
Unicode::Normalize はバージョン 1.31 から 1.32 に更新されました。
UNIVERSAL はバージョン 1.14 から 1.15 に更新されました。
User::grent はバージョン 1.03 から 1.04 に更新されました。
User::pwent はバージョン 1.01 から 1.02 に更新されました。
utf8 はバージョン 1.24 から 1.25 に更新されました。
warnings はバージョン 1.58 から 1.65 に更新されました。
XS::APItest はバージョン 1.22 から 1.32 に更新されました。
XSLoader はバージョン 0.31 から 0.32 に更新されました。
新しい class
機能を記述しています。
新しい class
機能の内部を記述しています。
私たちはこの文書で挙げられた変更を反映するように文書を更新しようとしています。 もし抜けている物を発見したら、 https://github.com/Perl/perl5/issues でイシューを開いてください。
それに加えて、以下のような変更が行われました。
hv_ksplit
を文書化しました
hv_name_set
を文書化しました
gv_autoload_pv
を文書化しました
gv_autoload_pvn
を文書化しました
gv_autoload_sv
を文書化しました
gv_name_set
を文書化しました
start_subparse
を文書化しました
SV_CHECK_THINKFIRST_COW_DROP
を文書化しました
SV_CHECK_THINKFIRST
を文書化しました
SvPV_shrink_to_cur
を文書化しました
save_aelem
を文書化しました
save_aelem_flags
を文書化しました
save_helem
を文書化しました
save_helem_flags
を文書化しました
予定されていない廃止予定とそのカテゴリに関する情報が追加されました。
既に予定されている廃止予定に関するカテゴリ情報を追加しました。
スマートマッチングとパッケージと区切りとしてのアポストロフィの 廃止予定情報を追加しました。
save_pushptr
を文書化しました
save_scalar_at
を文書化しました
新しい newAV_alloc_x
, newAV_alloc_xz
, *_simple
関数のエントリを perlguts に追加されました。
今はなき PrePAN サービスに関する参照が perlcommunity と perlmodstyle から削除されました。
シンボルの名付けの節が perlhacktips に追加されました。
perlexperiment は、defer ブロック修飾子とクォート風演算子の 追加の組の区切り文字に関する警告カテゴリについて適切に参照するように 編集されました。
スマートマッチングは、状態が実験的から廃止予定に移動しました。 残念ながら実験は良い結果となりませんでした。
ucfirst
, push
, unshift
, bless
関数の一部の表現が改善され、 例が追加されました。
C と XS コードで C マクロを使うことの落し穴と解決法を議論する 新しい節である "Writing safer macros" in perlhacktips が追加されました。
名前に関する想定外の問題を議論する新しい節である "Choosing good symbol names" in perlhacktips が追加されました。
空パターンのマッチングの振る舞いをより良く文書化し、 その新しい ${^LAST_SUCCESSFUL_PATTERN}
とそれとの関係について適切に 指定しました。
"Scoping Rules of Regex Variables" 節を追加し、 あちこちでその他の表現の改良が行われました。
新しい %{^HOOK}
インターフェースと、それが露出させている 新しい require__before
と require__after
フックに 関する情報を追加されました。
正規表現変数 ${^PREMATCH}
, ${^MATCH}
, ${^POSTMATCH}
の 情報を修正しました; これら全ては、不注意により誤って文書化されていました。 特に、これらは有効にするために /p 修飾子を使った正規表現処理の 後でだけ適切に動作します。
スコープ内で最後に成功した正規表現マッチングパターンを表現する 新しい正規表現変数 ${^LAST_SUCCESSFUL_PATTERN}
の情報を追加しました。
次のような追加と変更が、警告や致命的エラーメッセージを含む診断出力に 行われました。 診断メッセージの完全な一覧については、perldiag を参照してください。
catch
ブロックに必要な変数宣言がないエラーのための新しい 文法エラーが追加されました。 catch block requires a (VAR) を 参照してください。
Can't locate object method "INC", nor "INCDIR" nor string overload via package "%s" %s in @INC
(F) 新しいスタイルの class
であるパッケージ名に bless
を 呼び出そうとしました。 コンストラクタによって作られた実体は、すでに正しいクラスにいるので、 これは不要です。 実体は、bless
のようなその他の方法で作ることはできません。
Cannot assign :param(%s) to field %s because that name is already in use
(F) フィールドにパラメータ名を適用しようとしましたが、 その名前は既に同じクラスまたはその親クラスのその他のフィールドで 使われています。 これは名前の衝突を引き起こすので、許されていません。
Cannot create class %s as it already has a non-empty @ISA
(F) @ISA
配列が空でなく、その配列に既にパッケージがあるクラスを 作ろうとしました。 これは一貫性のない継承をもつクラスになるので、許されません。
Cannot invoke a method of "%s" on an instance of "%s"
(F) 異なるクラスの実体である値を渡すことで、 一つのクラスの method
サブルーチンを直接呼び出そうとしました。 メソッドは正しい実体フィールドへのアクセスを持っていないので、 これは許されません。
Cannot invoke method on a non-instance
(F) クラスのインスタンスではない値の中で渡すことで、 あるクラスの method
サブルーチンを直接呼び出そうとしました。 メソッドは正しい実体フィールドへのアクセスを持っていないので、 これは許されません。
Cannot '%s' outside of a 'class'
(F) class
定義の中でのみ意味があるキーワードの一つを、 そのようなクラスの中でない場所で使おうとしました。
Cannot reopen existing class "%s"
(F) 既に存在しているクラスに対する class
定義を始めようとしました。 一つのクラスは一つだけの定義ブロックを持ちます。
Can't bless an object reference
(F) 既にオブジェクトの実体を参照している値に bless
を 呼び出そうとしました。
(F) Cygwin で、空のパスでパス変換関数を呼び出しました。 空でないパスのみが正当です。
Class already has a superclass, cannot add another
(F) class
に対して、既に一つスーパークラスが指定されているときに、 :isa
属性を使って二つ目を指定しようとしました。 bless
で作られた実体のクラスと異なり、 class
キーワードで作られたクラスは複数のスーパークラスを作れません。
Class attribute %s requires a value
(F) かっこ付きで値を渡す必要がある属性をクラスに設定しようとしましたが、 値がありませんでした。 空白は属性名とその値の間には 許されない ということを忘れないでください; 次のように書く必要があります:
class Example::Class :attr(VALUE) ...
Class :isa attribute requires a class but "%s" is not one
(F) class
:isa
属性を使ってサブクラスを作るとき、 指名されたスーパークラスもまた class
キーワードを使って作られた 実際のクラスでなければなりません。
Field already has a parameter name, cannot add another
(F) 一つのフィールドには、引数名を割り当てるための :param
属性は最大一つまで適用できます; 一つが適用されていると二つ目は許されません。
Field attribute %s requires a value
(F) かっこ付きで値を渡す必要がある属性をフィールドに設定しようとしましたが、 値がありませんでした。 空白は属性名とその値の間には 許されない ということを忘れないでください; 次のように書く必要があります:
field $var :attr(VALUE) ...
Field %s is not accessible outside a method
(F) method
サブルーチンの本体の内側ではないように見えるコードから クラスのフィールド変数にアクセスしようとしました。 メソッドだけが実体のフィールドにアクセスできるので、 これは許されません。
Field %s of "%s" is not accessible in a method of "%s"
(F) 実際に定義されているものの内側にネストしているクラスのメソッドから クラスのフィールド変数にアクセスしようとしました。 メソッドだけが実体のフィールドにアクセスできるので、 これは許されません。
Only scalar fields can take a :param attribute
(F) :param
属性を配列やハッシュのフィールドに適用しようとしました。 現在の所これは許されていません。
Required parameter '%s' is missing for %s constructor
(F) 必須の名前付き引数を持つクラスのコンストラクタを呼び出しましたが、 引数を全く渡しませんでした。
Unexpected characters while parsing class :isa attribute: %s
(F) class
:isa
属性の値として、単一のクラス名にオプションで 末尾にバージョン番号がついているもの以外のものを指定しようとしました。 これはパーサを混乱させます。
Unrecognized class attribute %s
(F) class
定義に特定の名前の属性を追加しようとしましたが、 perl は要求された属性の名前を認識できませんでした。
Unrecognized field attribute %s
(F) field
定義に特定の名前の属性を追加しようとしましたが、 perl は要求された属性の名前を認識できませんでした。
Missing or undefined argument to %s via %{^HOOK}{require__before}
これは、切り替えようとしている新しいロケールがないときに使うための、 既にある診断メッセージの短い形式です。 以前の診断メッセージはこのような状況では誤解を招くものでした。
(S experimental::class) この警告は、 use feature 'class'
の ADJUST
キーワードを使うと出力されます。 このキーワードは現在のところ実験的で、その振る舞いは Perl の 将来のリリースでは変更される可能性があります。
(S experimental::class) この警告は、 use feature 'class'
の class
キーワードを使うと出力されます。 このキーワードは現在のところ実験的で、その振る舞いは Perl の 将来のリリースでは変更される可能性があります。
(W redefine) メソッドを再定義しました。 この警告を抑制するには、次のようにします:
{
no warnings 'redefine';
*name = method { ... };
}
Odd number of elements in hash field initialization
(W misc) オブジェクトのハッシュフィールドの初期化に奇数個の要素を 指定しました。 ハッシュはキー/値の組で初期化されるので、全てのキーには対応する値が なければなりません。 最後に足りない値は代わりに未定義値で埋められました。
Old package separator "'" deprecated
(W deprecated, syntax) 変数、サブルーチン、パッケージ名に 古いパッケージ区切り文字である "'" を使いました。 古いパッケージ区切り文字は Perl 5.40 で削除される予定です。
(S experimental::class) この警告は、 use feature 'class'
の field
キーワードを使うと出力されます。 このキーワードは現在のところ実験的で、その振る舞いは Perl の 将来のリリースでは変更される可能性があります。
(S experimental::class) この警告は、 use feature 'class'
の method
キーワードを使うと出力されます。 このキーワードは現在のところ実験的で、その振る舞いは Perl の 将来のリリースでは変更される可能性があります。
コンパイラは、最初に遭遇した文法エラーでパースを停止するようになりました。 歴史的に、コンパイラは複数のエラーを表示するために、 エラーを「飛び越し」して、パースを続けようとしていました。 strict 下での未定義変数のようなものについてはこれは意味があります。 しかし、文法エラーについては、続けることは、単に真のエラーを 分かりにくくするだけの無関係あるいはおかしなエラーの嵐を 引き起こす傾向があることがわかりました。 極端な場合では、セグメンテーションフォルトやその他の正しくない振る舞いを 引き起こすことすらありました。
従って、パースは最初に見えた文法エラーの後で止まるように 継続のロジックを改良しました。 未定義変数のような意味論のエラーはパースを止めないので、 まだコードのコンパイル中に複数のエラーがでることがあります。 しかし、文法エラーがある場合、perl によって報告された最後の エラーメッセージと表示された全てのエラーは、 実際に修正する必要があるものです。
クラスやパッケージの名前を出力するエラーメッセージは、 正確な値が読者に明確になるように、様々な文字がエスケープされた、 ダブルクォートでくくられた文字列を出力するように変更されました。 どの文字がエスケープされるかの正確な規則はやがて変更されるかもしれませんが、 現在の所は "
と \
以外の表示可能な ASCII 符号位置と、符号位置が 255 を超える unicode の単語文字はそのまま出力され、その他のシンボルは Data::Dumper がエスケープするのと同様に、 改行は \n
、ダブルクォートは \"
という風にエスケープします。 128-255 の範囲の符号位置は、unicode 端末にそのまま出力すると 問題を引き起こすかもしれないので、常にエスケープされます。
古いバージョンの perl では、ワンライナー
$ perl -le'"thing\n"->foo()'
は、次のエラーメッセージを正確に次に示すような形で、複数行にわたって 表示します; "\n" は生の改行文字として出力されるからです:
Can't locate object method "foo" via package "thing
" (perhaps you forgot to load "thing
"?) at -e line 1.
このリリース以降、代わりに (1 行で) 次を出力します:
Can't locate object method "foo" via package "thing\n"
(perhaps you forgot to load "thing\n"?) at -e line 1.
パッケージ名の改行はクォートおよびエスケープされ、従って エラーメッセージは 1 行で表示されます。 ここでの前述のテキストは見やすさのためだけに 2 行に 折りたたまれています。
エラーの中のパッケージやクラスの名前がとても長い場合、中間部分は メッセージから省略されます。 このリリースから、エラーメッセージのパッケージやクラスの名前は 最大で最初の 128 文字と最後の 128 文字のみが表示されます。 例えば
$ perl -le'("Foo" x 1000)->new()'
これは次のものを 1 行で表示します:
Can't locate object method "new" via package "FooFooFooFooFooFooFoo
FooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFoo
FooFooFooFooFooFooFooFooFooFooFooFooFooFo"..."oFooFooFooFooFooFooFoo
FooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFoo
FooFooFooFooFooFooFooFooFooFooFooFooFoo" (perhaps you forgot to load
"FooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFoo
FooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFo"...
"oFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFoo
FooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFoo"?)
at -e line 1.
この場合、パッケージ名の "先頭"..."末尾"
形式に注目してください。 以前のバージョンの perl では、完全な文字列が表示されることで エラーメッセージは 6k 以上の長さになり、エラーメッセージの長さの上限は 全くありませんでした。 もし事故でクラス名として 1MB の文字列を使うと、エラーメッセージは 2MB 以上の長さになっていました。 この Perl では、省略とエスケープを考慮すると 2k ぐらいになるはずです。
Complex regular subexpression recursion limit (%d) exceeded
は 削除されました
正規表現エンジンは場合によって再帰を使わなくなりました。 この警告はもはや意味がありません。
[GH #19636] を 参照してください。
メインの警告メッセージの下、その「位置情報」の後にかっこ付きの ヒントを生成するために使われる様々な警告は、 メインのメッセージにインラインでヒントを置くように変更されました。 例えば:
Bareword found where operator expected at -e line 1, near "foo bar"
(Do you need to predeclare foo?)
これは次のようなものを 1 行で表示します:
Bareword found where operator expected (Do you need to predeclare
foo?) at -e line 1, near "foo bar"
このような警告はもはや $SIG{__WARN__}
を 2 回引き起こすことはなく、 警告の致命的エラー化が有効の場合はヒントが表示されます。
require
や use
分が失敗したときに出力される エラーメッセージが変更されました。 以前は @INC contains:
という単語と、require が完了して失敗した 「後」の @INC
の状態を表示していました。 エラーメッセージは、 @INC entries checked:
と、require 文の間に実行された 実際のディレクトリまたはフックを反映するように変更されました。 例えば:
perl -e'push @INC, sub {@INC=()}; eval "require Frobnitz"
or die $@'
Can't locate Frobnitz.pm in @INC (you may need to install the
Frobnitz module) (@INC contains:) at (eval 1) line 1.
これは次のように変わります (明確化のために一部の出力は省略されています):
perl -e'push @INC, sub {@INC=()}; eval "require Frobnitz"
or die $@'
Can't locate Frobnitz.pm in @INC (you may need to install the
Frobnitz module) (@INC entries checked:
.../site_perl/5.38.0/x86_64-linux .../site_perl/5.38.0
.../5.38.0/x86_64-linux .../5.38.0 CODE(0x562745e684b8))
at (eval 1) line 1.
従って実際にチェックされたディレクトリが表示されます。 エラーメッセージの @INC contains:
をチェックしているコードは、 @INC
と :
の間の単語の変更に対して強化する必要があります; 例えば、前方互換性と後方互換性のために、 qr/\@INC contains:/
や qr/\@INC entries checked:/
ではなく qr/\@INC[ \w]+:/
を使うなどです。
Old package separator used in string
この診断メッセージは deprecated
カテゴリの一部にもなりました。
given is deprecated は given is experimental
を置き換えます。
when is deprecated は when is experimental
を置き換えます。
Smartmatch is deprecated は Smartmatch is experimental
を置き換えます。
make -j6 minitest
は、メイン make プロセスと子プロセスの間で $(MINIPERL_EXE)
のビルド中にビルドの衝突により 失敗することがありました。 [GH #19829]
Dragonfly BSD でホスト名が設定されていないときに 適切に osvers を設定します。
C99 のマクロ名 PRIX64
のタイプミスを修正しました。
古く壊れている GCC for VMS 対応を削除しました。
/VAXC
限定子への参照の痕跡を削除しました。
VMS の sharedperl オプションを削除しました。
VMS は mkostemp を持ちます。
Configure
は、gcc によって出力されたクォート付きの要素を 適切に扱えるようになりました。 [GH #20606]
Configure
は、関数の型が生成した、関数のための宣言と、実装が 一致しているかをテストすることで、malloc() と free() の返り値の型を 検査していました。 Solaris の C++ コンパイラでは、このチェックは常に失敗します; Solaris は C++ ビルドでは using
によって std::
から malloc() と free() をインポートするからです。 malloc() と free() の返り値の型は C 標準によって明確に定義されているので、 これの検査を飛ばすようになりました。 Configure
コマンドライン引数とヒントによって、 これが必要であるというありそうにない場合のためにこれらの型を上書きすることは まだできます。 [GH #20806]
このリリースのその他の追加と変更を反映してテストが追加、変更されました。 さらに、主に以下のような変更が行われました:
Unicode 正規化テストが追加されました。
t/test.pl: 番犬タイマーをキャンセルする機能が追加されました。
DEC Ultrix のための対応コードが削除されました。 Ultrix は、様々な Digital Equipment Corporation マシンのための ネイティブな Unix 風のオペレーティングシステムです。 この最後のリリースは 1995 年でした。
setproctitle() の明らかなバグを回避するためにテストをスキップします。 [GH #19894]
FreeBSD は、 FreeBSD のバグ を 回避するために、スレッドセーフなロケール操作を使わなくなりました。
archname の最初の部分を `uname -p` で置き換えました [GH #19791]
NetBSD/Solaris での regexec.c と regcomp.c の 一部のコンパイラとコンパイル時の問題を起きないようにしました。
DSM 7 のために Synology Readme を更新しました。
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]
多くの廃止予定の C 関数が削除されました。
これらは長い間廃止予定になっていました。 完全な一覧については https://github.com/perl/perl5/commit/7008caa915ad99e650acf2aea40612b5e48b7ba2 を参照してください。
get_op_descs
, get_op_names
, get_opargs
, get_no_modify
, get_ppaddr
は廃止予定としてマークされました。
hv_free_ent
は内部 API としてマークされました。
save_pushptr
, save_pushptrptr
, and save_pushi32ptr
は 内部 API としてマークされました。
5.36 で導入された新しい真偽値型を保管するために、新しい真偽値関連の 関数とマクロが追加されました:
関数は:
newSVbool(const bool bool_val)
newSV_true()
newSV_false()
sv_set_true(SV *sv)
sv_set_false(SV *sv)
sv_set_bool(SV *sv, const bool bool_val)
マクロは:
Perl はもはや environ
配列を直接操作しません。 PL_use_safe_putenv
変数は削除され、PERL_USE_SAFE_PUTENV
は 常に定義されます。 つまり、XS モジュールはセグメンテーションフォルトを引き起こすことなく setenv
と putenv
を呼び出せるということです。 [perl #19399]
内部 C API 関数は、対応しているプラットフォームでは __attribute__((hidden))
を使って隠されるようになりました。 つまり、これらはもはやこれらのプラットフォームの XS モジュールから 呼び出せないということです。
これらの関数は Windows では既に隠されていることは注意しておくべきです。 この変更は単に他のプラットフォームにも適用したものです。 [perl #19655]
U32
または I32
で宣言された値を表示するための新しいフォーマット シンボルが追加されました:
これらは、IVdf
のような既存の似たようなシンボルが使われるのと 同じように使われます。 "I/O Formats" in perlapi を参照してください。
新しい 'HvHasAUX' マクロ
regexec.c: いくつかの分岐予測再順序条件の追加
locale: マクロ名を C 準拠に変更
PADNAMEt_*
定数を PADNAMEf_*
にリネーム
引数を 1 回だけ評価するために、PV を受け取る全ての API マクロを、 インライン関数に変更。
regexec.c: コードをより読みやすくするための複数のコードリファクタリング
perl.h: マクロ名を C 準拠に変更 (NOT_IN_NUMERIC マクロから先頭の _ を除去)
regcomp.h: 既存の BITMAP_BYTE
と BITMAP_TEST
に加えて BITMAP_BIT
マクロを追加。
新しい regnode 型 ANYOFH。 populate_ANYOF_from_invlist は populate_bitmap_from_invlist に リネームされました。
regex: qr/[]/ のビットマップと非ビットマップのリファクタリング
regcomp.c: 転置リストからビットマップへの変換(およびその逆)のための 新しい関数 populate_bitmap_from_invlist
と populate_invlist_from_bitmap
を追加。
既存の AV から AV を作る newAVav()
を追加。 既存の HV からキーと値を使って AV を作る newAVhv()
を追加。
Perl_atof
の定義を修正。
regcomp.c の OPTIMIZE_INFTY
と差分に関するオーバーフローでの 未定義の振る舞いを修正。
regcomp.h の regnode ポインタのアライメントの問題を修正。
CVf_METHOD
CV フラグと関連する CvMETHOD
マクロは CVf_NOWARN_AMBIGUOUS
と CvNOWARN_AMBIGUOUS
にリネームされました。 これは、CV が class
機能の method
サブルーチンであることを 示している CvIsMETHOD
との混乱を減らすために、 実際の振る舞い (曖昧な名前に関して生成される警告を抑制する) を より反映するようになりました。
use
文の一部や属性適用として VERSION
, import
, unimport
メソッドを呼び出すように構築されたり、 :lvalue
サブルーチンに代入するときに、 もはや OP_ENTERSUB
op に OPf_SPECIAL
フラグを設定しなくなりました。
CV が XSUB であることを示し、CvXSUBANY.any_sv
共用体フィールドに SV ポインタを保管する、 新しい CV フラグ CVf_REFCOUNTED_ANYSV
が追加されました。 CV を複製したり破壊したりするような Perl コアの操作は、 SV へのポインタの参照関数を保守し、必要なら破壊します。
新しい API 関数 "Perl_localeconv
" in perlapi が追加されました。 これは (localeconv()
フィールドのハッシュを返す) POSIX::localeconv
と同じですが、 XS から直接呼び出せます。
新しい API 関数 "Perl_langinfo8
" in perlapi が追加されました。 これは普通の "Perl_langinfo
" in perlapi と同じですが、 返される文字列が UTF-8 かどうかを呼び出し側が簡単かつ確実に 分かるようにするための追加の引数があります。
C スタックオーバーフローを避けるために、eval EXPR
/BEGIN
ブロックと require
/BEGIN
(および use
文) のネスト数の制限を導入しました。 この変数は、eval EXPR
のコンパイル中に BEGIN
ブロックを実行させないためにも使えます。 制限のデフォルトは 1000
ですが、${^MAX_NESTED_EVAL_BEGIN_BLOCKS}
変数を 設定することで上書きできます。 デフォルト自体は次のようにしてコンパイル時に変更できます:
-Accflags='-DPERL_MAX_NESTED_EVAL_BEGIN_BLOCKS_DEFAULT=12345'
この値は C スタックのサイズに関連していて、不適切に大きな値を選ぶと、 Perl はセグメンテーションフォルトすることがあるので、 選ぶ値に関しては保守的になってください。
新しい magic 型 PERL_MAGIC_extvalue
が追加されました。 これは PERL_MAGIC_ext
と同様に使えますが、値の magic です: ローカル化すると新しい値はマジカルではありません。
The SSNEW()
, SSNEWt()
, SSNEWa()
, SSNEWat()
API は SSize_t
の値を返すようになりました。 SSPTR()
と SSPTRt()
マクロは SSize_t
の引数を想定するようになり、 デバッグビルドではこれを強制するようになりました。 [GH #20411]
cops の中のファイル名はスレッドの下で参照カウントされるようになりました。 スレッドの下では、ファイル名を個々のオペコードにコピーしていました。 これは、理論上はオペコードががあるスレッド作られたオペコードは 他のスレッドによって破壊されるかもしれないからです。 この変更は、共有メモリを使った、参照カウント付きの文字列である 新しい構造体/型 RCPV
を追加します。 これは、以前 char * を使っていたコードがそうし続けられる方法で実装されています; 参照カウントのデータは char * ポインタ自身の前の特定のオフセットに 配置されるからです。
特殊フォーマット HvNAMEf
と HvNAMEf_QUOTEDPREFIX
を追加しました。 これは HV *
を引数に取り、文字列、その長さ、および utf8 かどうかを 決定するのに HvNAME()
および関連するマクロを使います。
長い間廃止予定になっている GIMME
マクロを実装している 基礎を成す Perl_dowantarray
関数は廃止予定としてマークされました; 従って、このマクロの使用はコンパイル時警告を出力します。 GIMME
は GIMME_V
によって Perl v5.6.0 から廃止予定と記述されていましたが、 以前は警告を出力していませんでした。
API 関数 "utf8_length" in perlapi は、より効率的になりました。
現在の所、メモリに効率のいい形でファイル名と警告ビットを共有するための オペコードで使われている、RCPV
(参照カウントされた文字列/ポイント値) を 使うためのよりよい対応のための SAVERCPV()
と SAVEFREERCPV()
が 追加されました。
現在の文の最後に起動されるデストラクタを作ることができるようになる MORTALSVFUNC_SV()
と MORTALDESTRUCTOR_SV()
マクロが追加されました。 これは、変数が解放されたときに何らかの行動を引き起こすための "free" マジックを使うために PERL_MAGIC_destruct
マジックを使います。 行動は C 関数または Perl コードリファレンスとして指定できます。
カスタマイズされたサブルーチンでラップするのに問題が 一つまたは複数ある、選ばれた perl 関数をフックするための提供する、 %{^HOOK}
API と関連する PERL_MAGIC_hook
と PERL_MAGIC_hookelem
が追加されました。
require
が読み込もうとするファイル名を書き換えたり、 たとえ完全修飾ファイル名でも require
が特定のモジュールの 読み込みをブロックするのに使える、 ${^HOOK}{require__before}
対応が追加されました。 このフックは、「require の前」および「require の後」の行動を 実行するためにも使われます。
後でどのモジュールが require されたかを追跡するために使える ${^HOOK}{require__after}
対応が追加されました。
正規表現オペコード (regops) は、異なった形式のデータを公開するために 共用体を使う標準的な構造体配置を使うようになりました。 これにより、よりメモリを使うように regops を拡張または修正するのが 遙かに容易になりました。 これは多くの regops が、いくつかっこを含んでいるかを記録するために 使われていました。
'pack' テンプレートのパース中に再帰とスタックオーバーフローを 起こさなくなりました
正規表現コードブロックの最後の文として eval() があると、 インタプリタの panic を引き起こすことがありました; 例:
/(?{ ...; eval {....}; })/
bareword_filehandles
機能を無効にしても、もはや print Class->method
をエラーとして扱わなくなりました。 [GH #19704]
Perl のサブルーチンが goto &xs_sub
を使って XS サブルーチンを 末尾呼び出ししたとき、XS サブルーチンはその呼び出しコンテキストを 正しく決定できるようになりました。 以前はこれは常にスカラとして報告していました。
さらに、Perl サブルーチンが同時に開放される場所では:
sub foo { *foo = sub {}; goto &xs_sub }
XS サブルーチンが PL_op
を使おうとしたとき、これは NULL に設定されているので、以前はクラッシュを 引き起こすことがありました。 これは修正されました。
setsockopt() は、OPTVAL
引数として指定された数値と文字列値を よりよく区別するために 5.36 で追加された機構を使うようになりました。 [GH #18761]
4 引数の select()
は、255 を超える符号位置を持つ文字列を 拒否するようになりました。 さらに、符号位置 128-255 については、Perl がこの符号位置をどのように メモリに保管しているかに関わらず、常に対応するオクテットを OS に 渡すようになりました。 (以前は Perl はその内部文字列ストレージを OS にリークしていました。) [GH #19882]
val {} inside /(?{...})/
からの panic 問題を修正しました。 [GH #19390]
regexp.c., locale.c からの複数のコンパイラ警告を修正しました。 [GH #19915]
LC_NUMERIC
を持っていないプラットフォームでのロケール問い合わせのバグを 修正しました。 [GH #19890]
S_maybe_multideref()
での未定義の振る舞いを抑制しました。
use integer
op での符号付き整数オーバーフローを起きないようにしました。
hv_delete_common
で NULL ポインタへのオフセットを 追加しないようにしました。
PerlIO::get_layers は IO リファレンスも受け取るようになりました
以前はグロブリファレンスかグロブの名前だけを取っていました。 これは IO リファレンスも取るようになりました。
PL_splitstr
のメモリの扱いを修正しました:
スレッドが作られたとき、割り当てられた文字列が 2 回解放されていました。
二つの -F
オプションが指定されたとき、最初のオプションのために 割り当てられたメモリが解放されていませんでした。
左辺値を代入するとき、OPf_REF フラグを含まない CPAN モジュールによって 生成された OP_ANONCODE
op を正しく扱えるようになりました。 [GH #20532]
POSIX::strxfrm は、照合を指定するのに LC_COLLATE
の違いを無視して、 LC_CTYPE
ロケールカテゴリを使うようになりました。 あるロケール (例えばアラビア語の ISO-8859-6) でエンコードされている 文字列を、(ギリシャ語の ISO-8859-7 のような)他のロケールを基にして 照合するのは意味がありません。 Perl は現在の LC_CTYPE
ロケールカテゴリがエンコーディングおよび、 それに応じた照合順序を正しく表現していることを仮定します。
また、埋め込みの NUL
文字が入力に許されるようになりました。
ロケール照合がプラットフォームで有効になっていない場合、(LC_COLLATE
)、 入力は変更されずに戻されます。
オーバーロードされたオブジェクトを返す tie されたスカラの 文字列化の間に FETCH が 2 回行われる問題が修正されました。 FETCH メソッドは 1 回だけ呼び出されるべきでしたが、 このリリースの前では実際には 2 回呼び出されていました。 [GH #20574]
選択された出力ハンドルに関連するマジカル変数 $^
, $~
, $=
, $-
, $%
に書き込むとき、 IO オブジェクトが選択した出力ハンドルからクリアされていても perl がクラッシュしなくなりました。 [GH #20733]
use constant
で use constant
リスト定数を再定義すると 適切に警告されるようになりました。 この変更は use constant
の振る舞いの変更ですが、 constant.pm の変更ではなくコアの変更です。 [GH #20742]
空のプロトタイプ定数サブルーチンを持つ use constant
リスト定数を再定義すると、 アサート失敗を引き起こしていました。 [GH #20742]
@INC
の中のオブジェクトのための INC
メソッドが AUTOLOAD
によって解決されないという 5.36 にあった退行が 修正されました。 INC
が最初に解決されるので、@INC
の中のオブジェクトのための INCDIR
メソッドは AUTOLOAD
によって解決できません。 [GH #20665]
$SIG{__DIE__}
は、どのように die したかに関わらず、 コンパイル中にコードが die したとき、eval から 呼び出されるようになりました。 つまり、$@
をオブジェクトに昇格できることを想定しているコードは 一貫して呼び出されるということです。 以前のバージョンの perl では、未定義変数のような一部の コンパイルエラーでは <$SIG{__DIE__}> は呼び出されませんでした。 その他のエラーでは、ある程度の数以上のエラーがある場合は 呼び出されることがありましたが、それ以下では呼び出されませんでした。 全ての場合において呼び出されることが想定できるようになりました。
エラーのあるコードのコンパイルは、遭遇したエラーの数と種類に依存して 一貫性なく停止していました。 10 エラーの後コンパイルが停止するという意図でしたが、 このロジックのバグにより、一部の種類のエラーはカウントはされますが、 コンパイルを停止するための閾値チェックを引き起こしていませんでした。 その他のバグは引き起こしていました。 このリリースでは、エラーの種類にかかわらず、最大 10 のエラーの後 コンパイルは終了します。
設定プロセス中に PERL_STOP_PARSING_AFTER_N_ERRORS
に値を定義することで 最大値を変更できることに注意してください。 例えば:
./Configure ... -Accflags='-DPERL_STOP_PARSING_AFTER_N_ERRORS=100'
これは最大 100 エラーまでを許します。
API 関数 "my_snprintf" in perlapi は、 これを最終的に呼び出した perl コードが use locale
の スコープ内で、有効なロケールが求めている場合、 ドットでない小数点を表示するようになりました。
正規表現中の量指定グループ中の捕捉グループに関する多くのバグが 修正されました; 特に代替です。 例えば、次のようなパターンは:
"foobazfoobar" =~ /((foo)baz|foo(bar))+/
正規表現変数 $2
は以前の "foo" ではなく、未定義値になります。
捕捉グループの中にある正規表現後方参照演算子のバグが修正されました。 例えば:
"xa=xaaa" =~ /^(xa|=?\1a){2}\z/
これはマッチングしないという正しい動作になりました。 [GH #10073]
SSGROW()
と SSCHECK()
は、 要求された空間が確実に割り当てられるように再作業されました。 SSCHECK()
は SSGROW()
の別名になりました。
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 メーリングリストにあなたの感謝の言葉をメールします。
変更点の完全な詳細を見る方法については Changes ファイル。
Perl のビルド方法については INSTALL ファイル。
一般的なことについては README ファイル。
著作権情報については Artistic 及び Copying ファイル。