delete
perl -i
でのその場編集はより安全になりましたsprintf
の %j
フォーマットサイズ修飾子は C99 以前で利用可能になりました${^SAFE_LOCALES}
:locked
と :unique
の属性は削除されました\N{}
で中かっこの中に何も書かないのは不正になりました<<""
の意味で <<
を使うのはもはや許されなくなりましたIV_MAX
を超える値の Unicode 符号位置は致命的エラーになりましたB::OP::terse
メソッドは削除されました${^ENCODING}
に定義された値を設定するのは不正になりました-S
オプションで PATH の中の逆スラッシュはもはやコロンをエスケープしなくなりましたunpackstring()
の返り値型perl5280delta - perl v5.28.0 での変更点
この文書は 5.26.0 リリースと 5.28.0 リリースの変更点を記述しています。
5.24.0 のような以前のリリースから更新する場合は、まず 5.24.0 と 5.26.0 の違いについて記述している perl5260delta を読んでください。
変更の一覧は http://www.unicode.org/versions/Unicode10.0.0 にあります。
delete
delete
は キー/値のスライス に 使えるようになりました; 削除された値に関するキーを返します。 [perl #131328]
特定のパターンアサートの書き方を覚えるのが難しい場合、 英文字の同義語が使えるようになりました.
CURRENT NEW SYNONYMS
------ ------------
(?=...) (*pla:...) or (*positive_lookahead:...)
(?!...) (*nla:...) or (*negative_lookahead:...)
(?<=...) (*plb:...) or (*positive_lookbehind:...)
(?<!...) (*nlb:...) or (*negative_lookbehind:...)
(?>...) (*atomic:...)
これは実験的と考えられているので、これらを使うと(オフにしない限り) experimental::alpha_assertions
カテゴリの警告が発生します。
ある文字列の中で Cyrillic と Latin のような用字が混ざっているようなものは、 しばしばスプーフィング攻撃のサインとなります。 新しい正規表現構文はこれらを簡単に検出できるようになります。 例えば、次のようにすると:
qr/(*script_run: \d+ \b )/x
マッチングする数字は 10 ある中の同じ集合の中のものになります。 見た目と異なる値を持つ異なった用字からの数字に見えるものには マッチングしません。
または:
qr/(*sr: \b \w+ \b )/x
このようにすると全ての文字が同じ用字であることを確実にできます。
また、(?>...)
(あるいは *atomic:...)
) で用字を結合することも できます。
このように書く代わりに:
(*sr:(?<...))
次のようにできます:
(*asr:...)
# or
(*atomic_script_run:...)
これは実験的と考えられるので、これらを使うと (オフにしない限り) experimental::script_run
カテゴリの警告が発生します。
"Script Runs" in perlre を参照してください。
perl -i
でのその場編集はより安全になりました以前は、その場編集 (perl -i
) は、新しいファイルでの作業を開始すると すぐに入力ファイルは削除されたりリネームされたりしていました。
バックアップしていない場合、出力ファイルを書き込むときに ディスクフルのようなエラーが起きると、データを失うことになっていました。
これは、出力ファイルが完全に書き込まれ、閉じるのが成功するまで、 入力ファイルは置き換えられないように変更されました。
これは、同じディレクトリに作業用ファイルを作成し、出力ファイルが完成すると 入力ファイルにリネームされるという形で行われます。
非互換性:
このリネームは一度しか起きる必要がないため、スレッドや子プロセスを 作成した場合、このリネームは元のスレッドや プロセスでしか起こりません。
ファイルの処理中にディレクトリを変更し、オペレーティングシステムが unlinkat()
, renameat()
, fchmodat()
関数を提供していない場合、 最後のリネームは失敗するかもしれません。
永続的なレキシカル配列やハッシュは、state @a = qw(x y z)
のような式で 初期化できるようになりました。 永続的なレキシカル変数のリストの初期化はできないままです。
inode 番号が perl のネイティブの整数型より大きな型になっている プラットフォームの場合、 stat は、inode 番号を 10 進数の文字列で返すことで 大きい inode 番号を完全に保存します。 従って、inode 番号の正確な比較は ==
ではなく eq
で比較することで 行われます。 ==
での比較や(通常 inode 番号に対しては意味のない) その他の数値演算では、以前と同様に動作します; これは浮動小数点数にフォールバックし、もし実際の inode 番号が浮動小数点数 型式にとって大きすぎると、究極的にはあまり意味のない、丸められた inode 番号に対して 操作することになります。
sprintf
の %j
フォーマットサイズ修飾子は C99 以前で利用可能になりました実際に使われるサイズはプラットフォームに依存するため、移植性はないままです。
ファイル記述子を開くとき、プラットフォームが対応しているなら、 perl は一般的に close-on-exec フラグを設定した状態で開くようになりました。 これはスレッド安全性を改善します; なぜなら、あるスレッドで起動した exec
は、 もはや他のスレッドで開かれたファイル記述子を間違って実行されたプログラムに 渡されることはないからです。
さらに、perl は、アトミックに行うかどうかに関わらず、より確実に close-on-exec フラグを設定するようになりました。 ほとんどのファイル記述子はこのフラグを設定していましたが、 漏れている場合がありました。
Perl 5.22 から use feature 'bitwise'
のスコープの中で利用可能だった 新しい文字列固有 (&. |. ^. ~.
) および数値固有 (& | ^ ~
) の ビット単位演算子はもはや実験的ではなくなりました。 数値固有の op は、オペランドによって振る舞いを変える既存の演算子と 同じように綴ります。 これらの演算子は次の二つの方法のどちらの「ビット単位」機能経由で 有効にしなければならないままです:
use feature "bitwise";
use v5.28; # "bitwise" now included
これらはまた -E コマンドラインオプションでも有効にできます。
"bitwise" 機能はもはや警告を出さなくなりました。 以前使っていた "experimental::bitwise" 警告カテゴリを無効にしている 既存のコードはそのまま動作し続けます。
モジュール作者が気にする必要がある一つの問題は、数値演算子は オーバーロードされたメソッドの 5 番目の引数として TRUE を 渡すようになったということです。 オペランドの数をチェックするメソッドは、想定していない数が来るので croak するかもしれません。 次のようにしている XS 作者は:
SV *
bitop_handler (lobj, robj, swap)
このように変更する必要があるでしょう:
SV *
bitop_handler (lobj, robj, swap, ...)
これらのシステムには Visual Studio 2005 以降の Windows と POSIX 2008 システムが含まれます。
これにより、スレッド環境でも自由にロケールを使用および 変更できるようになりました。 変更は自身のスレッドにのみ影響を与えます。 "Multi-threaded operation" in perllocale を参照してください。
${^SAFE_LOCALES}
この変数は、Perl インタプリタが、安全にロケールを使用および変更できる 環境で実行されている場合に 1 になります (perllocale を参照してください)。 この変数は、perl がスレッド対応でないか、スレッドセーフなロケール操作 (前述の項目を参照)に対応していないプラットフォームで コンパイルされている場合に真になります。
大文字小文字無視修飾子付きのある種の正規表現パターンをコンパイルすると ヒープバッファオーバーフローを引き起こし、perl が クラッシュすることがありました。 これは修正されました。 [perl #131582]
正規表現パターン中のある種の文法エラーにおいて、 エラーメッセージにランダムでおそらく大きなメモリの塊を表示したり、perl を クラッシュさせたりしていました。 これは修正されました。 [perl #131598]
$ENV{$key}
スタックバッファオーバーフローWindows での %ENV
コードで起こりうるスタックバッファオーバーフローが、 バッファを完全に削除することで修正されました; これはどちらにしろ過剰でした。 [perl #131665]
Perl 5.28.0 では、Perl での使用において十分に安全であると考えられていない 様々な古いハッシュ関数が引退します。 現在四つの汎用ハッシュ関数、 Siphash (2-4 版と 1-3 版), Zaphod32, StadtX ハッシュを使います。 これに加えて、短い文字列のハッシュに SBOX32 (集計ハッシュ型式) を、 他のハッシュ関数と組み合わせて使います。
デフォルトでは Perl は 24 文字までの文字列では SBOX ハッシュを用い、 64 ビットビルドでは StadtX ハッシュを、32 ビットビルドでは Zaphod32 ハッシュと組み合わせます。
これらの設定は以下の Configure オプションで制御できます:
-DPERL_HASH_FUNC_SIPHASH
-DPERL_HASH_FUNC_SIPHASH13
-DPERL_HASH_FUNC_STADTX
-DPERL_HASH_FUNC_ZAPHOD32
SBOX ハッシュを無効にするには:
-DPERL_HASH_USE_SBOX32_ALSO=0
SBOX32 ハッシュを使う最大長を設定するには:
-DSBOX32_MAX_LEN=16
設定できる最大長は 256 までです。 これをデフォルトより大きい値にしても余り意味はないでしょう。
実験的なサブルーチンシグネチャ機能について、サブルーチン属性はシグネチャの 後ではなく前でなければならないように変更されました。 これは、:lvalue
のような属性がシグネチャの中のコードのコンパイルに 影響を与えることがあるからです; 例えば:
sub f :lvalue ($a = do { $x = "abc"; return substr($x,0,1)}) { ...}
これを入れ替えたのは 2 回目であることに注意してください:
sub f :lvalue ($a, $b) { ... }; # 5.20; 5.28 onwards
sub f ($a, $b) :lvalue { ... }; # 5.22 - 5.26
フォーマットに渡す変数の間のカンマを省略するのはもはや許されなくなりました。 これは Perl 5.000 から廃止予定になっていました。
:locked
と :unique
の属性は削除されましたこれらはなにもしておらず、それぞれ Perl 5.12 と 5.10 から 廃止予定になっていました。
\N{}
で中かっこの中に何も書かないのは不正になりましたこれは Perl 5.24 から廃止予定になっていました。
open()
と opendir()
を、ファイルハンドルとディレクトリハンドルの 両方に同じシンボル(グロブまたはスカラ)で関連付けるのに使うのは、 Perl 5.10 から廃止予定になっていました。
<<""
の意味で <<
を使うのはもはや許されなくなりました裸の区切り文字は Perl 5.000 から廃止予定になっていました。
これは undef
への設定のように動作していましたが、Perl 5.20 から 廃止予定になっていました。
IV_MAX
を超える値の Unicode 符号位置は致命的エラーになりましたこれは Perl 5.24 から廃止予定になっていました。
B::OP::terse
メソッドは削除されました代わりに B::Concise::b_terse
を使ってください。
これは Perl 5.004 から廃止予定になっていました。
0xFF
を越える符号位置に関するビット単位演算子は意味を持たないので、 そのような操作は、いくつかの場合を除いて croak するようになりました。 perldeprecation を参照してください。
これは Perl 5.24 から廃止予定になっていました。
${^ENCODING}
に定義された値を設定するのは不正になりましたこれは Perl 5.22 から廃止予定になっており、Perl 5.26 から 何もしなくなっていました。
-S
オプションで PATH の中の逆スラッシュはもはやコロンをエスケープしなくなりました以前は、-S
オプションは PATH
環境変数を辿るときに誤って 逆スラッシュ ("\") をコロンのエスケープとして扱っていました。 [perl #129183]
デバッグに対応した perl において、-D
デバッグオプションの H
フラグは削除されました。 これはハッシュ値をダンプする予定でしたが、何年も壊れたままでした。
Perl 5.12 での初期リリース時点から、...
(ヤダヤダ) 演算子は、 式ではなく文として扱うことを明示的に想定していました。 しかし、元の実装はこの点において混乱していて、一貫性のないパースを 引き起こしていました。 この演算子は、次のような、完全な文として扱えないような状況でも 誤って受け入れていました:
... . "foo";
... if $a < $b;
パースは一貫性を持つようになり、ヤダヤダは文としてのみ 許されるようになりました。 影響を受けるコードは、任意の式が使えるところにヤダヤダを置くために do{...}
が使えます。
Perl 5.8 から、sort プラグマには、sort 組み込み関数の 実装に使うアルゴリズムを指定するための _mergesort
, _quicksort
, _qsort
副プラグマがありました。 これは常に疑わしく、長続きしないかもしれない機能と考えられていたので、 下線付きの名前になっていて、Perl 5.8 から移植性がないと文書化されていました。 これらの副プラグマは削除され、これらを使おうとする試みはエラーとなります。 それ以外の sort プラグマは残り、アルゴリズム中立な stable
副プラグマをソートの振る舞いを制御するために使えます。 [perl #119635]
8 進と 2 進の浮動小数点数リテラルでは、基数点の前に現れる任意の 16 進文字を 許していました。 この数字は、基数点の前の数字が常にそうであるのと同様、その基数に 適切なもののみに制限されるようになりました。
unpackstring()
の返り値型C API 関数 unpackstring()
と unpack_str()
の返り値の型は I32
から SSize_t
変更されました; 20 億個以上のデータセットに対応するためです。
vec
の使用は廃止予定になりましたこれらの文字列は内部的に UTF-8 で表現されており、vec
はビット単位の操作を 行うので、これらの文字列に対してはおそらく想定外の結果となります。
"{"
の使用法の一部はもはや致命的ではなくなりましたPerl 5.26.0 はいくつかのエスケープされていない左中かっこの使用を 致命的エラーにしましたが、最後の瞬間に例外を作りました; 特に、GNU Autoconf が動作するように最小限の操作を行いました。 このツールはこれにとても依存していて、廃止予定の使い方を使い続けています。 ここでのエスケープされない左中かっこの使い方は、私たちが "{"
に他の意味を持たせる意図のないものでした。
この例外は、"{"
に他の意味を持たせないその他の様々な場合に 一般化されました。
これらの使用は廃止予定警告を出し続けることに注意してください。
"("
の直後の "{"
の使用は廃止予定になりましたエスケープされない左中かっこは公式にはどこでも廃止予定ですが、 その使用が言語の予定されている拡張を妨害しない文脈では強制されません。 このリリースから、中かっこが開きかっこの直後にある場合も 廃止予定に追加されました。 以前は、たとえ中かっこが正当な量指定子の一部でも、そのように解釈されず、 リテラル文字として解釈されていました; これは "("
をエラーと考える他の量指定子と異なっていました。 これらの使用は、オフにしない限り廃止予定警告が出るようになりました。
$[
への代入は Perl 5.30 から致命的エラーになります$[
に非 0 値を代入することは Perl 5.12 から廃止予定と なっていましたが、削除の期日は決まっていませんでした。 これは Perl 5.30 に予定されています。
Sys::Hostname::hostname()
に引数を渡すことは既に廃止予定と なっていましたが、削除の期日は決まっていませんでした。 これは Perl 5.32 に予定されています。 [perl #124349]
以下のモジュールは将来のリリースでコア配布から削除され、その時点で CPAN からインストールされる必要があるようになります。 これらのモジュールを必要とする CPAN 配布はこれらを依存関係に入れる 必要があります。
これらのモジュールのコア版は、この事実を知らせるために、 "deprecated"
カテゴリの警告を発生させます。 この廃止予定警告を止めるには、対象のモジュールを CPAN からインストールしてください。
これらは(まれな例外を除いて)使い続けることを勧められる、 良いモジュールであることに注意してください。 コアからの除去は基本的に、完全な機能を持ち、CPAN が利用可能な Perl の インストールに対する必要性を基準としていて、通常はその設計は考慮していません。
Unicode 特性 (\p{...}
) を含む正規表現パターンを作成するときの 初期オーバーヘッドがほとんどの場合で大きく減少しました。
内部的に multiconcat
オペコードが導入されたことにより、 多くの文字列結合式はかなり速くなりました; これは複数の連結およびオプションの =
または .=
を単一のアクションに 結合します。 例えば、別々に $s
, $a
, $b
を取得するのではなく、この式全体を 一つの op で扱えるようになりました:
$s .= "a=$a b=$b\n"
特別な場合として、代入の左側がレキシカル変数や my $s
の場合、op 自身が レキシカル変数の取得を扱うので、さらに速くなります。
一般的に、定数文字列と変数式を混ぜた式が多くなるほど、式が長くなるほど、 より多く非 utf8 文字列と utf8 文字列を混ぜることになるほど、 より大きく性能が改善します。 x86_64
システムの例として、このコードのベンチマークは 4 倍速くなります:
my $s;
my $a = "ab\x{100}cde";
my $b = "fghij";
my $c = "\x{101}klmn";
for my $i (1..10_000_000) {
$s = "\x{100}wxyz";
$s .= "foo=$a bar=$b baz=$c";
}
さらに、%s
と %%
のフォーマット要素のみを含む定数フォーマットの sprintf
式で、引数の数が固定の場合、 これも multiconcat
op に最適化されます。
ref()
組み込み関数は、真偽値コンテキストで非常に速くなりました; もはや Foo=ARRAY(0x134af48)
のような一時的文字列をわざわざ 作らなくなったからです。
無効コンテキストとスカラコンテキストでの keys()
はより効率的になりました。
次のように、index() の結果を -1 と比較するという一般的な慣用句は特に 最適化されました:
if (index(...) != -1) { ... }
for()
ループや似たような構文はほとんどの場合でより効率的になりました。
File::Glob は不必要なバックトラックと再帰を除去するように修正されました; Russ Cox に感謝します。 さらなる詳細については https://research.swtch.com/glob を 参照してください。
XS レベルの SvTRUE()
API 関数はより効率的になりました。
様々な整数を返す op はスカラ/真偽値コンテキストでより効率的になりました。
スタッシュ名をパースするときに少し性能が向上しました。 [perl #129990]
既に読み込まれているモジュールに対するo require
呼び出しは少し 速くなりました。 [perl #132171]
パターンマッチング [[:ascii:]]
および [[:^ascii:]]
の性能は、 EBCDIC プラットフォームを除いて大きく改善しました。
様々な最適化が正規表現パターンマッチングに適用されたので、 条件さえ揃えば、大幅な性能改善に気付くかもしれません。 しかし多くの様々なパターンを使うアプリケーションでは、全体としての改善は ほとんど分からないでしょう。
その他の最適化が UTF-8 の扱いに適用されましたが、これらはほとんどの アプリケーションに対しては典型的には大きな要素にはなりません。
このリリースでの複数のモジュールに渡るハイライトは:
Perl 5.6.0 で our
が導入されてから、use vars
の使用は非推奨でした。 このプラグマが使用可能な場所は Perl ソースコードから削除されました。
これにより B::Deparse の WARNING_BITS の出力に(良い方向に)少し 影響があります。
XSLoader はよりモダンになました; そしてほとんどのモジュールは既に perl 5.6 以上を要求しているので、この切り替えにより失われる機能はありません。 場合によっては、より後方互換性を高めるために CPAN 版には反映されないような 変更を、ローカルの実装に加えています。
Archive::Tar はバージョン 2.24 から 2.30 に更新されました。
この更新は、CVE-2018-12015: ディレクトリトラバーサル脆弱性の対応も含みます。 [cpan #125523]
arybase はバージョン 0.12 から 0.15 に更新されました。
Attribute::Handlers はバージョン 0.99 から 1.01 に更新されました。
attributes はバージョン 0.29 から 0.33 に更新されました。
B はバージョン 1.68 から 1.74 に更新されました。
B::Concise はバージョン 0.999 から 1.003 に更新されました。
B::Debug はバージョン 1.24 から 1.26 に更新されました。
注意: B::Debug は廃止予定であり、将来のバージョンの Perl で 削除される予定です。
B::Deparse はバージョン 1.40 から 1.48 に更新されました。
多くのバグ修正を含んでいますが、特に変数属性を正しく 逆パース出来るようになりました:
my $x :foo; # used to deparse as
# 'attributes'->import('main', \$x, 'foo'), my $x;
base はバージョン 2.25 から 2.27 に更新されました。
bignum はバージョン 0.47 から 0.49 に更新されました。
blib はバージョン 1.06 から 1.07 に更新されました。
bytes はバージョン 1.05 から 1.06 に更新されました。
Carp はバージョン 1.42 から 1.50 に更新されました。
コールスタックのパッケージが ISA
という名前を持っていたとき、 Carp はもはや "Not a GLOB reference" エラーを投げなくなりました。
Carp は、スタックトレースを生成するときに、Perl の参照カウントされない スタックによる長年のバグを回避しようと試みるようになりました。 [perl #52610]
Carp は、オブジェクトを overload モジュールを読み込むことなく オーバーロードすることはできないという仮定 (これは XS モジュールで作られたオブジェクトでは起こることがありました) をしないように修正されました。 以前は、XS で定義されたオーバーロードメソッド自身が Carp を呼び出すと 無限再帰になっていました。 [perl #132828]
Carp は overload::StrVal
の使用を避けるようになりました; 理由の一部は、 古いバージョンの overload (perl 5.14 以前に含まれていたもの) は Scalar::Util を実行時に読み込むため、文法エラーの後に Carp が 呼び出されると失敗するからです。
charnames はバージョン 1.44 から 1.45 に更新されました。
Compress::Raw::Zlib はバージョン 2.074 から 2.076 に更新されました。
これは、(Compress-Raw-Zlib に同梱されていた) 古いバージョンの 'zlib' ライブラリのセキュリティ脆弱性に対応しました。
Config::Extensions はバージョン 0.01 から 0.02 に更新されました。
Config::Perl::V はバージョン 0.28 から 0.29 に更新されました。
CPAN はバージョン 2.18 から 2.20 に更新されました。
Data::Dumper はバージョン 2.167 から 2.170 に更新されました。
グロブ名のクォートは Useqq オプションを拒否するようになりました [perl #119831]。
結合されたゲッター/セッターメソッドを通してオプションに undef
を 設定しようとしたとき、もはやゲッター呼び出しを間違わなくなりました [perl #113090]。
Devel::Peek はバージョン 1.26 から 1.27 に更新されました。
Devel::PPPort はバージョン 3.35 から 3.40 に更新されました。
Devel::PPPort は cpan-first から perl-first にメンテナンスが移りました。
Devel::PPPort のコードに関する優先的な責任はコア perl に移動しました。 実際問題としては、何かあってから更新が必要になるのではなく、 perl のシンボルに行われた変更により素早く追随できるかもしれないということを 除いて、何の変更もありません。
Digest::SHA はバージョン 5.96 から 6.01 に更新されました。
DirHandle はバージョン 1.04 から 1.05 に更新されました。
DynaLoader はバージョン 1.42 から 1.45 に更新されました。
この文書は、__PACKAGE__
の使い方と、直接オブジェクト文法について 示すようになりました [perl #132247]。
Encode はバージョン 2.88 から 2.97 に更新されました。
encoding はバージョン 2.19 から 2.22 に更新されました。
Errno はバージョン 1.28 から 1.29 に更新されました。
experimental はバージョン 0.016 から 0.019 に更新されました。
Exporter はバージョン 5.72 から 5.73 に更新されました。
ExtUtils::CBuilder はバージョン 0.280225 から 0.280230 に更新されました。
ExtUtils::Constant はバージョン 0.23 から 0.25 に更新されました。
ExtUtils::Embed はバージョン 1.34 から 1.35 に更新されました。
ExtUtils::Install はバージョン 2.04 から 2.14 に更新されました。
ExtUtils::MakeMaker はバージョン 7.24 から 7.34 に更新されました。
ExtUtils::Miniperl はバージョン 1.06 から 1.08 に更新されました。
ExtUtils::ParseXS はバージョン 3.34 から 3.39 に更新されました。
ExtUtils::Typemaps はバージョン 3.34 から 3.38 に更新されました。
ExtUtils::XSSymSet はバージョン 1.3 から 1.4 に更新されました。
feature はバージョン 1.47 から 1.52 に更新されました。
fields はバージョン 2.23 から 2.24 に更新されました。
File::Copy はバージョン 2.32 から 2.33 に更新されました。
利用可能な場合は Time::HiRes によって提供される utime() による秒以下の精度を使うようになりました [perl #132401].
File::Fetch はバージョン 0.52 から 0.56 に更新されました。
File::Glob はバージョン 1.28 から 1.31 に更新されました。
File::Path はバージョン 2.12_01 から 2.15 に更新されました。
File::Spec と Cwd はバージョン 3.67 から 3.74 に更新されました。
File::stat はバージョン 1.07 から 1.08 に更新されました。
FileCache はバージョン 1.09 から 1.10 に更新されました。
Filter::Simple はバージョン 0.93 から 0.95 に更新されました。
Filter::Util::Call はバージョン 1.55 から 1.58 に更新されました。
GDBM_File はバージョン 1.15 から 1.17 に更新されました。
この文書は、each
と delete
はこのモジュールで tie されたハッシュで 混ざらないことを説明するようになりました [perl #117449]。
It will now retry opening with an acceptable block size if asking gdbm にデフォルトブロックサイズを尋ねるのに失敗した場合、 受け入れられるブロックサイズで開くことを再挑戦するようになりました [perl #119623]。
Getopt::Long はバージョン 2.49 から 2.5 に更新されました。
Hash::Util::FieldHash はバージョン 1.19 から 1.20 に更新されました。
I18N::Langinfo はバージョン 0.13 から 0.17 に更新されました。
このモジュールは全てのプラットフォームで利用可能になりました; nl_langinfo(3) がないシステムではこれをエミュレートするようになりました。 文書に詳細が書かれている ように、いくつかの問題はあります; CODESET
を実装されていないシステムでの、 MS Windows 以外での最も大きな問題は、 常に ""
を返すことです。
文字列が正当な非 ASCII の UTF-8 を含み、ロケールが UTF-8 の場合は、 返されるスカラに UTF-8 フラグを設定するようになりました [perl #127288]。
この変更では、RADIXCHAR
と THOUSEP
においてロケールが無視され、 それぞれ常にドットと空文字列が返るというバグも修正されました。 ロケールに適した値が返されるようになりました。
I18N::LangTags はバージョン 0.42 から 0.43 に更新されました。
if はバージョン 0.0606 から 0.0608 に更新されました。
IO はバージョン 1.38 から 1.39 に更新されました。
IO::Socket::IP はバージョン 0.38 から 0.39 に更新されました。
IPC::Cmd はバージョン 0.96 から 1.00 に更新されました。
JSON::PP はバージョン 2.27400_02 から 2.97001 に更新されました。
libnet
配布はバージョン 3.10 から 3.11 に更新されました。
List::Util はバージョン 1.46_02 から 1.49 に更新されました。
Locale::Codes はバージョン 3.42 から 3.56 に更新されました。
注意: Locale::Codes は Perl 5.30 でコアから削除される予定です。
Locale::Maketext はバージョン 1.28 から 1.29 に更新されました。
Math::BigInt はバージョン 1.999806 から 1.999811 に更新されました。
Math::BigInt::FastCalc はバージョン 0.5005 から 0.5006 に更新されました。
Math::BigRat はバージョン 0.2611 から 0.2613 に更新されました。
Module::CoreList はバージョン 5.20170530 から 5.20180622 に更新されました。
mro はバージョン 1.20 から 1.22 に更新されました。
Net::Ping はバージョン 2.55 から 2.62 に更新されました。
NEXT はバージョン 0.67 から 0.67_01 に更新されました。
ODBM_File はバージョン 1.14 から 1.15 に更新されました。
Opcode はバージョン 1.39 から 1.43 に更新されました。
overload はバージョン 1.28 から 1.30 に更新されました。
PerlIO::encoding はバージョン 0.25 から 0.26 に更新されました。
PerlIO::scalar はバージョン 0.26 から 0.29 に更新されました。
PerlIO::via はバージョン 0.16 から 0.17 に更新されました。
Pod::Functions はバージョン 1.11 から 1.13 に更新されました。
Pod::Html はバージョン 1.2202 から 1.24 に更新されました。
A title for the HTML 文書のタイトルはデフォルトで POD 文書の "NAME" 節から自動的に 生成されるようになりました; これはモジュールが中心となる作業を行うのに Pod::Simple::XHTML を使うように 書き直される前と同じ状態です [perl #110520].
Pod::Perldoc はバージョン 3.28 から 3.2801 に更新されました。
podlators
配布はバージョン 4.09 から 4.10 に更新されました。
man ページ参照と関数名は、Solaris の標準ではなく、the Linux man page formatting standards に従うようになりました。
POSIX はバージョン 1.76 から 1.84 に更新されました。
スレッド対応のアプリケーションでロケール特有の関数を使うことに関する 注意を追加しました。
re はバージョン 0.34 から 0.36 に更新されました。
Scalar::Util はバージョン 1.46_02 から 1.50 に更新されました。
SelfLoader はバージョン 1.23 から 1.25 に更新されました。
Socket はバージョン 2.020_03 から 2.027 に更新されました。
sort はバージョン 2.02 から 2.04 に更新されました。
Storable はバージョン 2.62 から 3.08 に更新されました。
Sub::Util はバージョン 1.48 から 1.49 に更新されました。
subs はバージョン 1.02 から 1.03 に更新されました。
Sys::Hostname はバージョン 1.20 から 1.22 に更新されました。
Term::ReadLine はバージョン 1.16 から 1.17 に更新されました。
Test はバージョン 1.30 から 1.31 に更新されました。
Test::Harness はバージョン 3.38 から 3.42 に更新されました。
Test::Simple はバージョン 1.302073 から 1.302133 に更新されました。
threads はバージョン 2.15 から 2.22 に更新されました。
文書はスレッドから値を返すときの問題についてよりよく記述するようになり、 もはや BEGIN
ブロックでスレッドを作ることに関して警告しなくなりました。 [perl #96538]
threads::shared はバージョン 1.56 から 1.58 に更新されました。
Tie::Array はバージョン 1.06 から 1.07 に更新されました。
Tie::StdHandle はバージョン 4.4 から 4.5 に更新されました。
Time::gmtime はバージョン 1.03 から 1.04 に更新されました。
Time::HiRes はバージョン 1.9741 から 1.9759 に更新されました。
Time::localtime はバージョン 1.02 から 1.03 に更新されました。
Time::Piece はバージョン 1.31 から 1.3204 に更新されました。
Unicode::Collate はバージョン 1.19 から 1.25 に更新されました。
Unicode::Normalize はバージョン 1.25 から 1.26 に更新されました。
Unicode::UCD はバージョン 0.68 から 0.70 に更新されました。
num
関数は、診断エラーを返す助けとなるオプションの引数を 受け付けるようになりました。
User::grent はバージョン 1.01 から 1.02 に更新されました。
User::pwent はバージョン 1.00 から 1.01 に更新されました。
utf8 はバージョン 1.19 から 1.21 に更新されました。
vars はバージョン 1.03 から 1.04 に更新されました。
version はバージョン 0.9917 から 0.9923 に更新されました。
VMS::DCLsym はバージョン 1.08 から 1.09 に更新されました。
VMS::Stdio はバージョン 2.41 から 2.44 に更新されました。
warnings はバージョン 1.37 から 1.42 に更新されました。
名前が _at_level
で終わる新しい関数が追加され、 呼び出し元が正確な呼び出しフレームを指定できるようになりました。 [perl #132468]
XS::Typemap はバージョン 0.15 から 0.16 に更新されました。
XSLoader はバージョン 0.27 から 0.30 に更新されました。
この文書は、__PACKAGE__
の使用と、例の DynaLoader
の使用法に関して 直接オブジェクト構文を示すようになりました [perl #132247].
読み込み可能ライブラリの名前を変更するのに mod2fname
を使っている プラットフォームで、正しい、変更されていない名前の ブートストラップファイル (.bs) を探すようになりました。
VMS::stdio
互換機能は削除されました。
私たちはこの文書で挙げられた変更を反映するように文書を更新しようとしています。 もし抜けている物を発見したら、 perlbug@perl.org にメールしてください。
それに加えて、以下のような変更が行われました。
API 関数 perl_parse()
, perl_run()
, perl_destruct()
は包括的に 文書化されました; 以前は perlembed チュートリアルへの参照しか ありませんでした。
newGIVENOP()
の文書は、遅ればせながらレキシカルな $_
の削除に 対応する形で更新されました。
API 関数 newCONSTSUB()
と newCONSTSUB_flags()
は以前よりさらに 包括的に文書化されました。
DB::sub()
が呼び出される条件の記述を明確化しました。 [perl #131672]
"Variable length lookbehind not implemented in regex m/%s/" in perldiag
これは、Perl 5.18 で導入された (しかしその perldelta には明示的には 文書化されなかった) 問題を回避するためのさらなるアイデアを 与えるようになりました; この問題は、一部の Unicode の /i
規則は 次のようなものを:
(?<!st)
可変長と考えられるので、認められないということです。
"Use of state $_ is experimental" in perldiag
この実験的な構文は perl 5.24.0 で削除されたので、この項は削除されました。
診断メッセージ Initialization of state variables in list context currently forbidden
は Initialization of state variables in list currently forbidden
に変更されました; 単一の集合 state 変数による リストコンテキストの初期化は許されるようになったからです。
perlembed にある例は、終了方法に関してより移植性があるようになり、 組み込み Perl インタプリタからの終了コードを得る例については 正しい場所から得るようになりました。 構成された argv を Perl に渡す例では、argv[argc]
に null が 必須であることを示すようになりました。
perlembed の例は、croak() を呼び出すとき、ERRSV
の文字列値を フォーマット文字列として使っていました。 この文字列に %s
のようなフォーマットコードが含まれていると、 プログラムをクラッシュさせることがありました。
これは croak_sv() の呼び出しに変更されました。
代替案はよくある型式文字列を補う方法:
croak("%s", SvPV_nolen(ERRSV));
あるは単に ERRSV
専用の方法として:
croak(NULL);
組み込み関数によって生成される警告は perldiag と warnings に 文書化されていることが記述されました。 [perl #116080]
exists
演算子の文書はもはや、自動有効化の振る舞いが 「将来のリリースで修正予定」とは書かれなくなりました。 私たちはデフォルトの振る舞いを変えようとはしないことを決定しました。 [perl #127712]
bless
演算子の文書に関するいくつかの小さな詳細が明確化されました。 [perl #124428]
require
の文書の中の @INC
フックの記述は、 フィルタサブルーチンは使い道のない最初の引数を受け取ることを記すように 修正されました。 [perl #115754]
ref
の文書は明確化のために書き直されました。
use
の文書は、バージョンチェック機能に関して、何が文法的に バージョン番号として正しいと認められるかを説明するようになりました。
warn
の文書は、Perl 5.14 から複雑な例外オブジェクトを die
と等価な方法で扱うことを反映するように更新されました。 [perl #121372]
die
と warn
の文書は、明確化のために見直されました。
each
の文書は改善され、反復子状態の共有に関するもう少し明示的な記述と、 while-each の虚弱性による警告で改善されました。 [perl #132644]
次のものの違いを説明するために、require
の明確化が追加されました:
require Foo::Bar;
require "Foo/Bar.pm";
smoke-me
ブランチを識別するための正確な規則が記述されました。
perlguts の参照カウントの章は大きく見直され、プログラマが、 物理的なデータ構造の意味ではなく、これに関して考える必要がある方法に 関して記述されるようになりました。
UTF-8 マルチバイトに関する文書の改善。
内部関数 newXS_len_flags()
および newATTRSUB_x()
が文書化されました。
DESTROY
メソッドの文書は修正、更新、見直しされました; 特に、例外とどのように相互作用するかに関する部分です。 [perl #122753]
perlop の x
演算子の記述が明確化されました。 [perl #132460]
perlop は、qw
の空白規則がASCII 空白のみを使う split
のものとは 異なることを記すように更新されました。
演算子の優先順位と結合性に関する一般的な説明が修正および明確化されました。 [perl #127391]
\
参照演算子に関する文書は、そのオペランドに適用される 一般的でないコンテキストに関して説明するようになりました。 [perl #131061]
メタ文字と文字クラスの明確化。
メタ文字の明確化。
-M と -m の違いの明確化。 [perl #131518]
set-id スクリプトに関する文書が更新されました。 [perl #74142]
Perl スクリプトの実行に sudo
を使うことに関する章が追加されました。
perlsyn の「真偽値」の章は、ここと関係がないので削除され、 perldata にある同じ話題の段落と結合されました。
コードブロックとハッシュ構築子の間の曖昧さをなくす方法は、既に perlref に文書化されていますが、perlsyn でも文書化されました。 [perl #130958]
perluniprops は、\p{Word}
に \p{Join_Control}
特性に マッチングする符号位置が含まれることを注意するように更新されました。 この特性に対する変更は Perl 5.18 で行われていましたが、 今まで文書化されていませんでした。 今のところこの特性にマッチングするのは U+200C (ZERO WIDTH NON-JOINER) と U+200D (ZERO WIDTH JOINER) の二つの符号位置だけです。
各バイナリテーブルや特性に関して、この文書は、 \x00-\xFF
の範囲でどの文字がマッチングするか、および、 それ以上の符号位置の範囲でマッチングする最初のいくつかの範囲の一覧を 含むようになりました。
perlvar の $+
のエントリは、複数の名前を持つ捕捉グループの扱いに関する 記述が拡張されました。
様々な場所で、暗黙の defined
や $_
への代入のような、 while ループの条件式での特殊ケースに関する文書が改善しました。 [perl #132644]
次のような追加と変更が、警告や致命的エラーメッセージを含む診断出力に 行われました。 診断メッセージの完全な一覧については、perldiag を参照してください。
Can't "goto" into a "given" block
(F) given
ブロックの途中に飛び込むような "goto" 文が実行されました。 ここでそれはできません。 "goto" in perlfunc を参照してください。
Can't "goto" into a binary or list expression
二項演算子やリスト演算子の引数に飛び込むために goto
を使うことは、 クラッシュやスタック破壊を防ぐために禁止されています。 [perl #130936]
固定数の引数を取る演算子の最初の引数にのみ入ることができます; この場合はスタック破壊をもたらさないからです。 [perl #132854]
Old package separator used in string
(W syntax) "In $name's house"
のように、ダブルクォート文字列の内側の 変数名に古いパーケージ区切り文字である "'" を使いました。 これは "In $name::s house"
と等価です。 前者を意味しているなら、アポストロフィの前に逆スラッシュを置いてください ("In $name\'s house"
)。
再帰正規表現内で数値で量指定された副パターンを使ったときの 偽陽性の警告はは起こらなくなりました。 [perl #131868]
無効コンテキストでの結合演算子の無意味な使用に関する警告は、 $a.$b.$c
のような複数の結合を持つ式でも発生するようになりました; 以前は誤って警告されていませんでした。 [perl #6997]
変数やサブルーチンに対する "masks earlier declaration in same ..." 警告や our
変数の再宣言に関する警告は、新しい警告カテゴリ "shadow" に 移動しました。 以前はこれらは "misc" カテゴリでした。
Sys::Hostname::hostname()
による、これは引数を受け取らないという 廃止予定警告は、警告がエラーになる Perl バージョンについて 言及するようになりました。 [perl #124349]
perldiag の、set-id スクリプトに関するエラーのエントリは、 エラーは特定のセキュリティ脆弱性を報告しているということと、これを どのように修正するかについて明確になるように拡張されました。
Unable to flush stdout
エラーメッセージは末尾の改行が抜けていました。 [debian #875361]
--help
と --version
のオプションが追加されました。
C89 requirement
1998 年 10 月から、Perl はビルドするのに C89 コンパイラが必要であると 文書化されていました。 Perl の内部は、C89 標準で定義されている機能に依存することで、 様々な単純化が行われました。 私たちはこの内部変更が Perl がビルドできるプラットフォーム一覧に 影響を与えないと信じていますが、もしあなたのプラットフォームでのビルドに 新しい問題が起きた場合はバグを報告してください。
GCC では、-Werror=pointer-arith
はデフォルトで有効になり、 void や関数ポインタに対する算術演算が禁止されました。
HTML 版の文書をインストールしているとき、HTML 文書は互いを参照するのに 相対リンクを使うようになりました。 Links from the index page of perlipc のインデックスページから個々の章の文書へのリンクは 正しくなりました。 [perl #110056]
lib/unicore/mktables は、作成したファイルに保管されている依存名を 正しく正規化するようになりました。
regen/mk_invlists.pl は、その他の regen/*.pl スクリプトと異なり、 生成するファイルに保管される依存の名前自身として $0
を使っていました。 これはリテラルを使うようになったので、生成されたファイルに保管されたパスは、 どのように regen/mk_invlists.pl が起動されたかに依存しなくなりました。
正規化名がない場合に t/porting/regen.t でテストが失敗することがありました。 [perl #132925]
New probes
XS-APItest ディレクトリのテストは、可能な場合は並列に 行われるようになりました。
Perl は github ミラーでの Travis CI テストのためのデフォルトの .travis.yml ファイルを含むようになりました。 [perl #123981]
re/pat_psycho.t の番犬タイマーカウントは上書きできるようになりました。
このテストは実行に長い時間が掛かるため、これをチェックするための タイマーがあります (現在は 5 分)。 このコミットでは環境変数 PERL_TEST_TIME_OUT_FACTOR
のチェックを 追加します; これが設定されると、タイムアウト設定はその値で乗算されます。
harness は t/io/openpid.t の実行時にもはや 30 秒待たなくなりました。 [perl #121028] [perl #132867]
過去数年、私たちは三つの異なるアーカイブ形式で perl をリリースしてきました: bzip (.bz2
), LZMA2 (.xz
), gzip (.gz
) です。 xz は圧縮率がよく展開が高速で、gzip は互換性が高くメモリ消費が少ないので、 このリリースから .bz2
アーカイブ形式でリリースしなくなりました。 (もしこれが問題を引き起こすなら、教えてください; 後述する "Reporting Bugs" を参照してください。)
これらの、どうやら長い間死んだままのプラットフォームに関するコンパイラヒントや その他の対応は削除されました。
CentOS 5 でのコンパイルは修正されました。
quadmath ライブラリを使ったコンパイルは Cygwin で行えるようになりました。
asctime_r
のような再入可能関数に対応しているバージョンの Darwin では、 Perl は正しくこれらを使うようになりました。
FreeBSD の /usr/share/mk/sys.mk は、ARM と MIPS 以外の アーキテクチャでは -O2
を指定するようになりました。 デフォルトでは perl は同じ最適化レベルでコンパイルされます。
VMS が持っている (または持っていない) 関数を記すために、 いくつかの修正が configure.com に行われました。
CRTL 機能は、decc$feature_set
と decc$feature_set_value
の関数を 使うことで、Perl を起動する前に組み込み側から設定できるようになりました。 以前は、イメージ初期化後にこの機能を設定しようとしても無視されていました。
(Visual C++ 14.1 を含む) Microsoft Visual Studio 2017 を使って Windows で perl をコンパイルする機能が追加されました。
非英語システムでのVisual C++ コンパイラのバージョン検出が改善しました。
14.1 より前のバージョンでの Visual C++ を使った 64 ビットビルドで、 正しく $Config{libpth}
を設定するようになりました。
optimize_optree()
という新しい最適化フェイズがコンパイラに追加されました; これはピープホール最適化器が実行される直前に、完全な op 木を トップダウンでスキャンします。 このフェーズは今のところフックできません。
OP_MULTICONCAT
op が追加されました。 optimize_optree()
のときに、 OP_CONCAT
と OP_CONST
op のチェーン、およびオプションの OP_STRINGIFY
や OP_SASSIGN
は、単一の OP_MULTICONCAT
op に 結合されます。 この op は UNOP_AUX
型で、aux 配列には引数カウントに加えて、 定数文字列へのポインタとセグメント長の集合を含みます。 例えば次のものでは:
my $x = "foo=$foo, bar=$bar\n";
定数文字列は "foo=, bar=\n"
で、セグメント長は (4,6,1) です。 文字列に utf8 の基で表現が変わる \x80
のような文字が含まれている場合、 文字列と長さの組が二つ事前計算されて保管されます。
PL_keyword_plugin
への直接アクセスは、 マルチスレッド時には安全ではありません。 スレッドから読み込まれても XS モジュールが安全にカスタムキーワードを 定義できる、新しい wrap_keyword_plugin
関数が追加されました; PL_check
/ wrap_op_checker
の関係と同様です。
PL_statbuf
インタプリタ変数は削除されました。
XS からアクセス可能であった廃止予定の関数 to_utf8_case()
は 削除されました。
新しい関数 is_utf8_invariant_string_loc()
が追加されました; これは is_utf8_invariant_string()
と 同様ですが、もしあれば最初の異体文字の位置を保管するための追加の ポインタ引数を取ります。
新しい関数 Perl_langinfo()
が追加されました。 これは システムの nl_langinfo(3)
の(ほとんど)完全互換品ですが、 これがないプラットフォームでも動作します; あmた、よりスレッドセーフで、ロケールの扱いに関するいくつかの癖を 呼び出し元から隠します。 これを使っているコードは、小数点や桁区切りや通貨記号を探すのに localeconv(3)
を使う (そして癖による影響を受ける) 必要はありません。 "Perl_langinfo" in perlapi を参照してください。
新しい API 関数 sv_rvunweaken()
が sv_rvweaken()
の逆として追加されました。 この実装は "unweaken" in Scalar::Util から取られています。
新しいフラグ SORTf_UNSTABLE
が追加されました。 これにより、将来ユーザーが `no sort stable' を指定したときに マージソートを不安定にするような変更が可能になります。 マージソートはデフォルトで安定したままであると決定されたからです。
スレッド対応 perl では XS モジュールは自動的に再入可能版の システム関数を使えるようになりました。
これを
#define PERL_REENTRANT
XS
ファイルの先頭付近に置くと、このシステムに再入可能関数があることを perl が知っている場合、自動的に通常の非再入可能版ではなくこちらが 使われるようにコンパイルされます。 例えば、コード中に getpwnam()
を書くと、getpwnam_r()
を持つ システムでは、前者の呼び出しは自動的に後者の呼び出しに変換されます。 これはスレッド対応 perl でしか起こりません; それ以外では不要だからです。 どの関数が再入可能かについてはシステムによって異なることに注意してください。
PERL_NO_OP_PARENT
ビルド定義はもはや非対応となりました; つまり、 perl は常に PERL_OP_PARENT
を有効にしてビルドされます。
OP_TRANS
/OP_TRANSR
op の op_pv
フィールドに付けられる 非 utf8 文字変換テーブルの形式と内容が変わりました。 これは struct OPtrans_map
になりました。
新しいコンパイラ #define
である dTHX_DEBUGGING
が追加されました。 これは、-DDEBUGGING
の基でしかコンパイルされないデバッグ文が 必要としているというだけの理由でスレッドのコンテキストが 必要な XS や C のコードに有用です。
新しい API 関数 "Perl_setlocale" in perlapi が追加されました。
"sync_locale" in perlapi は、システムがグローバルなロケールを使うかどうかを 示す真偽値を返すように改訂されました。
"nonelem" スカラと呼ばれる、新しい種類のマジックスカラが導入されました。 これは、要素が存在しないことを示すために配列に保管されます; この要素が潜在的な左辺値コンテキストとしてアクセスされるかには依りません。 これは可能な場所ではどこでも既存の "defelem" (deferred element) マジックを置き換え、かなりより効率的です。 つまり、some_sub($sparse_array[$nonelem])
は、その要素が配列の中に ある限り、もはや毎回新しい defelem マジックスカラを作る必要は ないということです。
これは、配列がシフトしたり逆シフトしたりするとき、保留された要素とその 配列との同期が取れなくなるという稀なバグを部分的に修正します。 [perl #132729]
リスト代入 (aassign
) は、ある種の稀な状況で、 揮発性スタックにエントリを割り当て、そのエントリを初期化しないままにして、 クラッシュを引き起こす可能性がありました。 [perl #131570]
既にその名前の関数が存在する our
変数に属性を適用しようとすると、 SV が想定されているところで NULL ポインタが渡され、perl が クラッシュすることがありました。 [perl #131597]
split ' '
は、 unicode_strings
機能の スコープ内で split される引数を正しく扱えるようになりました。 以前は、Unicode の規則では空白だけれども ASCII の規則ではそうでない文字を 含んだ単一バイト内部表現を使った文字列を使うと、 これはフィールド区切り文字ではなくフィールドの一部として扱われていました。 [perl #130907]
いくつかの組み込み関数は、内容を書き込むための割り当てる場所がない 内部スタックに書き込むことがあるというバグがありました。 まれな状況では、これがクラッシュを引き起こすことがありました。 これらのバグは修正され、 もし同様のバグが将来導入された場合も、デバッグビルドで自動的に 検出されるようになりました。
導入されたこれらの内部スタック使用チェックは、 XSUB の呼び出し時に entersub
演算子によっても行われます。 つまり、どの XSUB が十分なスタック空間を割り当てるのに失敗したかを 報告できるということです。 [perl #131975]
ハッシュ参照のキーとして接尾辞デリファレンス文法のシンボリックリファレンスを 使うと、デバッグビルドでアサート失敗を引き起こしていました。 [perl #131627]
キャレットで始まる名前を持つ配列変数とハッシュ変数は、 文字列に変数置換されるときに、 @{^CAPTURE}
の添え字としての "${^CAPTURE[0]}"
のように、 中かっこの中に添え字を入れることを許すようになりました。 [perl #131664]
以前は UTF-8 だったけれども今は違うグロブ名を取得すると、 UTF-8 フラグの付いた名前を返していました。 [perl #131263]
(基となる C 関数 Perl_sv_vcatpvfn_flags()
経由の) perl の sprintf()
関数は、大きな幅や精度指定子による整数回り込みや バッファオーバーランの可能性を含む、 多くの小さなバグを修正するために大幅に書き直されました。 これにより多くの場合でより速くなりました。
通常か例外によってかに関わらず、eval
から終了した場合、 (おそらくデストラクタを呼び出す) $@
を設定する 前に、 常に一時的な値を解放するようになりました。 例えば:
sub DESTROY { eval { die "died in DESTROY"; } }
eval { bless []; };
# $@ used to be equal to "died in DESTROY" here; it's now "".
-flto -mieee-fp
ビルドでの重複シンボルエラーが修正されました。 pp.c は _LIB_VERSION
を定義していましたが、-lieee
がすでに 定義していました。 [perl #131786]
字句解析器はもはや、不完全な浮動小数点数の指数部を消費しなくなりました。 [perl #131725]
非スレッドビルドで、 $null
が空文字列のときの m/$null/
は、 もはや、以前のマッチング演算子に /o
が含まれていても、 /o
フラグがあるかのように振る舞わなくなりました。 この振る舞いの実装のための書き直しはインタプリタを混乱させることがありました。 これはスレッドビルドの振る舞いと一致します。 [perl #124368]
sub
キーワードに改行を含む空白(およびコメント)が引き続く場合、 sub
宣言が解放後使用を引き起こすことがありました。 [perl #131836]
字句解析器は、 ${identifier}
構文の中の空白を読み飛ばすときに、 パースポインタを正しく調整するようになりました。 [perl #131949]
${^LAST_FH}
へのアクセスは、もはや非グロブへの I/O 操作を使った後に アサートを発生させなくなりました。 [perl #128263]
XS レベルの Copy()
, Move()
, Zero()
マクロおよびその変種は、 提供されたポインタが NULL
のときにアサートするようになりました。 ISO C では、これらのマクロで使われる関数に NULL が提供された場合、 たとえカウンタ引数が 0 でも振る舞いは未定義です。 これらのアサートと元のバグ報告に従って、三つのマクロ呼び出しは 条件付きになりました。 [perl #131746] [perl #131892]
サブルーチンシグネチャの引数のデフォルトを定義するのに、 =
演算子のみが許されるようになりました。 以前は、+=
のようなその他の代入演算子も誤って許されていました。 [perl #131777]
:prototype
警告で常にパッケージ名が含まれるようになりました [perl #131833]
以前はデバッグビルでのみ jmpenv
構造体に存在した je_old_stack_hwm
フィールドが、非デバッグビルドでも 存在するようになりました。 これにより、この構造体のサイズがデバッグビルドと非デバッグビルドで 異なることよる、いくつかの CPAN モジュールの問題が修正されます。 [perl #131942]
ninstr()
マクロへの引数は正しくかっこが付くようになりました。
S_regmatch()
関数での NULL ポインタのデリファレンスが修正されました。 [perl #132017]
空の LIST
で exec PROGRAM LIST を 呼び出したときの問題が修正されました。 これは空の (終端の NULL
ポインタのみを含む) argv
配列で execvp()
を呼び出すべきでしたが、単に ($!
を設定せずに) 偽を返していました。 [perl #131730]
Perl 5.22 では gv_fetchmeth_sv
C 関数は、 UTF-8 名を持つ定数を取り出すときに、その定数サブルーチンが 完全な型グロブではなく単純なスカラリファレンスとしてスタッシュに 保管されていると、正しく動作しなくなっていました。 これは修正されました。
1 文字デバッガコマンドに句読点文字で始まる引数が引き続く場合 (例えば p$^V
や x@ARGV
)も、再び動作するようになりました。 以前は誤ってコマンドと引数の間に空白を要求していました。 [perl #120174]
splice は、 読み込み専用配列を変更しようとしたときに例外 ("Modification of a read-only value attempted") を投げるようになりました。 以前は暗黙に配列を変更していました。 新しい振る舞いは push および unshift の振る舞いと一貫性があります。 [perl #131000]
stat()
, lstat()
およびファイルテスト演算子は、 nul 文字を含んでいるときに失敗するようになりました; open()
は既に失敗するようになっていました。
stat()
, lstat()
およびファイルテスト演算子は、 閉じていたりその他の理由で不正なファイルハンドルに対して適用されたことによる 失敗が起きたときに、確実に $!
を設定するようになりました。
Windows での -k
(sticky bit) のような、特定のプラットフォームに存在しない Unix の許可ビットに対するファイルテスト演算子は、無差別に偽の結果を返す前に、 そのファイルが存在するかどうかをテストして、引数がファイルを参照していない 場合は適切なエラーを返すようになりました。
文字変換演算子の文字集合の最初の \N{}
で始まる範囲をパースするときの 'read before buffer' オーバーランが 修正されました。 [perl #132245]
コンパイル時に空の \N{}
パースするときにスカラがリークする問題が 修正されました。 [perl #132245]
ディレクトリやブロックデバイスに対するdo $path
は、 $!
に意味のあるエラーコードを設定するようになりました。 [perl #125774]
汚染された文字列化を提供するオーバーロードされた置換値を使った 正規表現置換は、正しく結果文字列が汚染されるようになりました。 [perl #115266]
do { my sub lex; 123 }
のような、do
ブロックの中のレキシカルな サブルーチン宣言がスタックを壊して、内側の文のスタックに既にある内容を 消すことがありました。 これは修正されました。 [perl #132442]
pack
と unpack
は、繰り返しカウントと長さに 20 億を超える値を 扱えるようになりました。 [perl #119367]
8 進と 2 進の浮動小数点数リテラルの小数点の後ろの数字は、 浮動小数点数の仮数部が整数型に納まらないプラットフォームでも正しい重みを 持つようになりました。
正規化された真の値は、もはや呼び出し可能なサブルーチンとしての偽の 特別な意味を持たなくなりました。 これは import
や unimport
のメソッドがないときのマジカルな プレースホルダとして使われていましたが、 その他の文字列 1
と同様に扱われるようになりました。 [perl #126042]
system
は、引数から文字列への変換を親プロセスで行うようになったので、 それを文字列化したときの効果 (オーバーロードの呼び出しや警告の出力など) は、 プログラムが想定した方法で現れるようになりました。 [perl #121105]
readpipe()
組み込み関数は、引数式が一つしかなく、 それがスカラコンテキストであることをコンパイル時に チェックするようになったので、 実行時にスタックを壊さないようになりました。 [perl #4574]
sort
は $a
と $b
を別名化したときに参照カウントを正しく 扱うようになったので、ソート比較子の実行中に再び別名化したときに スカラの早すぎる破壊とリークを起こさないようになりました。 [perl #92264]
引数なしの reverse
はデフォルトでは $_
を反転しますが、 もはやスタックを壊す危険がなくなりました。 [perl #132544]
exec
, system
などはもはや、再入呼び出しや tie されたスカラのような マジックによって引数リストが壊れても責任をもたなくなりました。 [perl #129888]
Perl 自身の malloc
は、64 ビットプラットフォームで 1 ギガバイト以上 割り当てようとしても、もはや混乱しなくなりました。 [perl #119829]
ソート比較式の中でファイルテスト演算子をスタック差せてももはや クラッシュしなくなりました。 [perl #129347]
リファレンスへの同一の tr///
変換はもはや、 代入可能かどうかの判断のためのリファレンスと間違わなくなりました。 [perl #130578]
長い 16 進、8 進、2 進浮動小数点数リテラルは、浮動小数点数として影響を 与えないような下位の桁をパースするときに、もはや未定義の振る舞いを しなくなりました。 [perl #131894]
open $$scalarref...
や同様の起動はもはやファイルハンドルを リークしなくなりました。 [perl #115814]
ある種の複雑な正規表現はもはやコンパイル時に算術オーバーフローを 引き起こさなくなりました。 [perl #131893]
newGVgen
を避けたことによるデフォルトの typemap は、 XSUBs がファイルハンドル (PerlIO *
または FILE *
) を返したときに もはやリークしなくなりました。 [perl #115814]
プロトタイプ付きの XS サブルーチンとして BEGIN
を作った場合、 もはやサブルーチンの早い解放によってクラッシュしなくなりました。
printf
フォーマット指定子 %.0f
はもはや誤った丸めを行わなくなり [perl #47602]、 負の 0 に関して正しい符号を表示するようになりました。
Scalar value @arrayname[0] better written as $arrayname
エラーが出るところで、配列名が Inf
で始まっていると、 Cannot printf Inf with 'c'
エラーが出る問題が修正されました。 [perl #132645]
PathTools 配布の Cwd
の getcwd()
の Perl 実装は、 エラーに関して XS 実装と同じ振る舞いをするようになりました: これはエラーを返し、$!
を設定します。 [perl #132648]
配列要素はスタックに置かれた時点で有効化されるようになりました。 Fixes [perl #8910] (2002 年 4 月に報告されました)。
かっこに引き続く大かっこによる添え字のパースが修正されました。 [perl #8045] (2001 年 12 月に報告されました)。
tr/non_utf8/long_non_utf8/c
は、置き換える文字リストの長さが 0x7fff を超える場合に間違った結果を返していました。
tr/non_utf8/non_utf8/cd
は検索文字リストに暗黙の \x{100}-\x{7fffffff}
を追加するのに失敗していました。
文字列の変数置換や s///e
の右側のような、 「perl 内部の perl」構文内でのコンパイル失敗は、 より早い時点でコンパイルを中止するようになりました。
以前は、他のエラーを報告するためにコンパイルが続行し、 しかし失敗した部分パースが部分的にパースした構文をパーサの shift-reduce スタックに残すことがあり、 パーサが混乱して、perl のクラッシュを引き起こしていました。 [perl #125351]
小数点(基数点)文字がドットでないスレッド対応 perl で、 本当の小数点文字が必要になった場合、スレッド間で競合状態となることが ありました。 これは、ロケールがスレッドセーフでないシステムではミューテックスを使うことで 修正されました; ロケールがスレッドセーフの場合はそもそもこの問題は 発生しません。
正規表現文字クラスのコンパイル時のエラーが、ときどきアサート失敗を 引き起こしていました。 [perl #132163]
Perl 5.28.0 は、Perl 5.26.0 以降、76 人の作者によって、 2,200 のファイルに約 730,000 行の変更を加えて、 約 12 ヶ月開発されてきました。
自動生成ファイル、文書、リリースツールを除くと、1,300 の .pm, .t, .c, .h ファイルに約 580,000 行の変更を加えました。
Perl は、活気のあるユーザーと開発者のコミュニティのおかげで 30 年を超えて 繁栄しています。 以下の人々が、Perl 5.28.0 になるための改良に貢献したことが分かっています:
Aaron Crane, Abigail, Ævar Arnfjörð Bjarmason, Alberto Simões, Alexandr Savca, Andrew Fresh, Andy Dougherty, Andy Lester, Aristotle Pagaltzis, Ask Bjørn Hansen, Chris 'BinGOs' Williams, Craig A. Berry, Dagfinn Ilmari Mannsåker, Dan Collins, Daniel Dragan, David Cantrell, David Mitchell, Dmitry Ulanov, Dominic Hargreaves, E. Choroba, Eric Herman, Eugen Konkov, Father Chrysostomos, Gene Sullivan, George Hartzell, Graham Knop, Harald Jörg, H.Merijn Brand, Hugo van der Sanden, Jacques Germishuys, James E Keenan, Jarkko Hietaniemi, Jerry D. Hedden, J. Nick Koston, John Lightsey, John Peacock, John P. Linderman, John SJ Anderson, Karen Etheridge, Karl Williamson, Ken Brown, Ken Cotterill, Leon Timmermans, Lukas Mai, Marco Fontani, Marc-Philip Werner, Matthew Horsfall, Neil Bowers, Nicholas Clark, Nicolas R., Niko Tyni, Pali, Paul Marquess, Peter John Acklam, Reini Urban, Renee Baecker, Ricardo Signes, Robin Barker, Sawyer X, Scott Lanning, Sergey Aleynikov, Shirakata Kentaro, Shoichi Kaji, Slaven Rezic, Smylers, Steffen Müller, Steve Hay, Sullivan Beck, Thomas Sibley, Todd Rinaldo, Tomasz Konojacki, Tom Hukins, Tom Wyant, Tony Cook, Vitali Peil, Yves Orton, Zefram.
これはバージョンコントロール履歴から自動的に生成しているので、ほぼ確実に 不完全です。 特に、Perl バグトラッカーに問題を報告をしてくれた (とてもありがたい)貢献者の 名前を含んでいません。
このバージョンに含まれている変更の多くは、Perl コアに含まれている CPAN モジュール由来のものです。 私たちは Perl の発展を助けている CPAN コミュニティ全体に感謝します。
全ての Perl の歴史的な貢献者のより完全な一覧については、どうか Perl ソース 配布に含まれている AUTHORS を参照してください。
もしバグと思われるものを見つけたら、 https://rt.perl.org/ にある perl バグ データベースを確認してください。 Perl ホームページ、http://www.perl.org/ にも情報があります。
もしまだ報告されていないバグだと確信したら、そのリリースに含まれている perlbug プログラムを実行してください。 バグの再現スクリプトを十分小さく、しかし有効なコードに切りつめることを 意識してください。 バグレポートは perl -V
の出力と一緒に perlbug@perl.org に送られ Perl porting チームによって解析されます。
報告しようとしているバグがセキュリティに関するもので、公開されている メーリングリストに送るのが不適切なものなら、バグの報告方法の詳細について "SECURITY VULNERABILITY CONTACT INFORMATION" in perlsec を参照してください。
もし Perl 5 でなされた作業について Perl 5 Porters に感謝したいと考えたなら、 perlthanks
プログラムを実行することでそうできます:
perlthanks
これは Perl 5 Porters メーリングリストにあなたの感謝の言葉をメールします。
変更点の完全な詳細を見る方法については Changes ファイル。
Perl のビルド方法については INSTALL ファイル。
一般的なことについては README ファイル。
著作権情報については Artistic 及び Copying ファイル。