NAME

perl5280delta - perl v5.28.0 での変更点

DESCRIPTION

この文書は 5.26.0 リリースと 5.28.0 リリースの変更点を記述しています。

5.24.0 のような以前のリリースから更新する場合は、まず 5.24.0 と 5.26.0 の違いについて記述している perl5260delta を読んでください。

コアの拡張

Unicode 10.0 対応

変更の一覧は 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 カテゴリの警告が発生します。

混合 Unicode 用字を検出可能になりました

ある文字列の中で 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) は、新しいファイルでの作業を開始すると すぐに入力ファイルは削除されたりリネームされたりしていました。

バックアップしていない場合、出力ファイルを書き込むときに ディスクフルのようなエラーが起きると、データを失うことになっていました。

これは、出力ファイルが完全に書き込まれ、閉じるのが成功するまで、 入力ファイルは置き換えられないように変更されました。

これは、同じディレクトリに作業用ファイルを作成し、出力ファイルが完成すると 入力ファイルにリネームされるという形で行われます。

非互換性:

[perl #127663]

Initialisation of aggregate state variables

永続的なレキシカル配列やハッシュは、state @a = qw(x y z) のような式で 初期化できるようになりました。 永続的なレキシカル変数のリストの初期化はできないままです。

フルサイズの inode 番号

inode 番号が perl のネイティブの整数型より大きな型になっている プラットフォームの場合、 stat は、inode 番号を 10 進数の文字列で返すことで 大きい inode 番号を完全に保存します。 従って、inode 番号の正確な比較は == ではなく eq で比較することで 行われます。 == での比較や(通常 inode 番号に対しては意味のない) その他の数値演算では、以前と同様に動作します; これは浮動小数点数にフォールバックし、もし実際の inode 番号が浮動小数点数 型式にとって大きすぎると、究極的にはあまり意味のない、丸められた inode 番号に対して 操作することになります。

sprintf%j フォーマットサイズ修飾子は C99 以前で利用可能になりました

実際に使われるサイズはプラットフォームに依存するため、移植性はないままです。

Close-on-exec フラグはアトミックに設定されます

ファイル記述子を開くとき、プラットフォームが対応しているなら、 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 がスレッド対応でないか、スレッドセーフなロケール操作 (前述の項目を参照)に対応していないプラットフォームで コンパイルされている場合に真になります。

セキュリティ

[CVE-2017-12837] 正規表現コンパイラのヒープバッファオーバーフロー

大文字小文字無視修飾子付きのある種の正規表現パターンをコンパイルすると ヒープバッファオーバーフローを引き起こし、perl が クラッシュすることがありました。 これは修正されました。 [perl #131582]

[CVE-2017-12883] 正規表現パーサのバッファの読み込み過ぎ

正規表現パターン中のある種の文法エラーにおいて、 エラーメッセージにランダムでおそらく大きなメモリの塊を表示したり、perl を クラッシュさせたりしていました。 これは修正されました。 [perl #131598]

[CVE-2017-12814] Windows での $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 を使ってください。

非メソッドに対する継承された AUTOLOAD はもはや許されなくなりました

これは Perl 5.004 から廃止予定になっていました。

0xFF を越える符号位置を持つ文字列に対するビット単位の文字列演算子の使用は許されなくなりました

0xFF を越える符号位置に関するビット単位演算子は意味を持たないので、 そのような操作は、いくつかの場合を除いて croak するようになりました。 perldeprecation を参照してください。

これは Perl 5.24 から廃止予定になっていました。

${^ENCODING} に定義された値を設定するのは不正になりました

これは Perl 5.22 から廃止予定になっており、Perl 5.26 から 何もしなくなっていました。

-S オプションで PATH の中の逆スラッシュはもはやコロンをエスケープしなくなりました

以前は、-S オプションは PATH 環境変数を辿るときに誤って 逆スラッシュ ("\") をコロンのエスケープとして扱っていました。 [perl #129183]

-DH (DEBUG_H) (非)機能は削除されました

デバッグに対応した 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 億個以上のデータセットに対応するためです。

廃止予定

符号位置が 0xFF を越える文字列に対する vec の使用は廃止予定になりました

これらの文字列は内部的に UTF-8 で表現されており、vec はビット単位の操作を 行うので、これらの文字列に対してはおそらく想定外の結果となります。

正規表現中のエスケープされない "{" の使用法の一部はもはや致命的ではなくなりました

Perl 5.26.0 はいくつかのエスケープされていない左中かっこの使用を 致命的エラーにしましたが、最後の瞬間に例外を作りました; 特に、GNU Autoconf が動作するように最小限の操作を行いました。 このツールはこれにとても依存していて、廃止予定の使い方を使い続けています。 ここでのエスケープされない左中かっこの使い方は、私たちが "{" に他の意味を持たせる意図のないものでした。

この例外は、"{" に他の意味を持たせないその他の様々な場合に 一般化されました。

これらの使用は廃止予定警告を出し続けることに注意してください。

正規表現中の "(" の直後の "{" の使用は廃止予定になりました

エスケープされない左中かっこは公式にはどこでも廃止予定ですが、 その使用が言語の予定されている拡張を妨害しない文脈では強制されません。 このリリースから、中かっこが開きかっこの直後にある場合も 廃止予定に追加されました。 以前は、たとえ中かっこが正当な量指定子の一部でも、そのように解釈されず、 リテラル文字として解釈されていました; これは "(" をエラーと考える他の量指定子と異なっていました。 これらの使用は、オフにしない限り廃止予定警告が出るようになりました。

$[ への代入は Perl 5.30 から致命的エラーになります

$[ に非 0 値を代入することは Perl 5.12 から廃止予定と なっていましたが、削除の期日は決まっていませんでした。 これは Perl 5.30 に予定されています。

hostname() は Perl 5.32 から引数を受け付けなくなります

Sys::Hostname::hostname() に引数を渡すことは既に廃止予定と なっていましたが、削除の期日は決まっていませんでした。 これは Perl 5.32 に予定されています。 [perl #124349]

モジュールの削除

以下のモジュールは将来のリリースでコア配布から削除され、その時点で CPAN からインストールされる必要があるようになります。 これらのモジュールを必要とする CPAN 配布はこれらを依存関係に入れる 必要があります。

これらのモジュールのコア版は、この事実を知らせるために、 "deprecated" カテゴリの警告を発生させます。 この廃止予定警告を止めるには、対象のモジュールを CPAN からインストールしてください。

これらは(まれな例外を除いて)使い続けることを勧められる、 良いモジュールであることに注意してください。 コアからの除去は基本的に、完全な機能を持ち、CPAN が利用可能な Perl の インストールに対する必要性を基準としていて、通常はその設計は考慮していません。

B::Debug
Locale::Codes とそれに関連付けられる Country, Currency, Language モジュール

性能改善

モジュールとプラグマ

このリリースでの複数のモジュールに渡るハイライトは:

use vars の削除

Perl 5.6.0 で our が導入されてから、use vars の使用は非推奨でした。 このプラグマが使用可能な場所は Perl ソースコードから削除されました。

これにより B::Deparse の WARNING_BITS の出力に(良い方向に)少し 影響があります。

多くのモジュールでの DynaLoader の使用は XSLoader に変更されました

XSLoader はよりモダンになました; そしてほとんどのモジュールは既に perl 5.6 以上を要求しているので、この切り替えにより失われる機能はありません。 場合によっては、より後方互換性を高めるために CPAN 版には反映されないような 変更を、ローカルの実装に加えています。

更新されたモジュールとプラグマ

削除されたモジュールとプラグマ

文書

既存の文書の変更

私たちはこの文書で挙げられた変更を反映するように文書を更新しようとしています。 もし抜けている物を発見したら、 perlbug@perl.org にメールしてください。

それに加えて、以下のような変更が行われました。

perlapi

perldata

perldebguts

perldiag

perlembed

perlfunc

perlgit

perlguts

perlintern

perlobj

perlop

perlrequick

perlretut

perlrun

perlsec

perlsyn

perluniprops

perlvar

perlfunc, perlop, perlsyn

診断メッセージ

次のような追加と変更が、警告や致命的エラーメッセージを含む診断出力に 行われました。 診断メッセージの完全な一覧については、perldiag を参照してください。

新しい診断メッセージ

新しいエラー

新しい警告

既存の診断メッセージの変更

ツールの変更

perlbug

設定とコンパイル

テスト

パッケージング

過去数年、私たちは三つの異なるアーカイブ形式で perl をリリースしてきました: bzip (.bz2), LZMA2 (.xz), gzip (.gz) です。 xz は圧縮率がよく展開が高速で、gzip は互換性が高くメモリ消費が少ないので、 このリリースから .bz2 アーカイブ形式でリリースしなくなりました。 (もしこれが問題を引き起こすなら、教えてください; 後述する "Reporting Bugs" を参照してください。)

プラットフォーム対応

削除されたプラットフォーム

PowerUX / Power MAX OS

これらの、どうやら長い間死んだままのプラットフォームに関するコンパイラヒントや その他の対応は削除されました。

プラットフォーム固有の注意

CentOS

CentOS 5 でのコンパイルは修正されました。

Cygwin

quadmath ライブラリを使ったコンパイルは Cygwin で行えるようになりました。

Darwin

asctime_r のような再入可能関数に対応しているバージョンの Darwin では、 Perl は正しくこれらを使うようになりました。

FreeBSD

FreeBSD の /usr/share/mk/sys.mk は、ARM と MIPS 以外の アーキテクチャでは -O2 を指定するようになりました。 デフォルトでは perl は同じ最適化レベルでコンパイルされます。

VMS

VMS が持っている (または持っていない) 関数を記すために、 いくつかの修正が configure.com に行われました。

CRTL 機能は、decc$feature_setdecc$feature_set_value の関数を 使うことで、Perl を起動する前に組み込み側から設定できるようになりました。 以前は、イメージ初期化後にこの機能を設定しようとしても無視されていました。

Windows

内部の変更

バグ修正の抜粋

Acknowledgements

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 メーリングリストにあなたの感謝の言葉をメールします。

SEE ALSO

変更点の完全な詳細を見る方法については Changes ファイル。

Perl のビルド方法については INSTALL ファイル。

一般的なことについては README ファイル。

著作権情報については Artistic 及び Copying ファイル。