NAME

perl5240delta - perl v5.24.0 での変更点

DESCRIPTION

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

コアの拡張

接尾辞デリファレンスは実験的ではなくなりました

postderef 機能と postderef_qq 機能を使っても警告が発生しなくなりました。 以前使われていた、experimental::postderef 警告カテゴリを無効にしている 既存のコードはそのまま動作します。 postderef 機能は何の効果もありません; 全ての Perl コードは、スコープ内で どの機能が宣言されているかに関わらず、接尾辞デリファレンスを使えます。 5.24 機能バンドルは postderef_qq 機能を含むようになりました。

Unicode 8.0 に対応しました

このリリースによる詳細は、 http://www.unicode.org/versions/Unicode8.0.0/ を参照してください。

その場編集出力ファイルを閉じるのに失敗すると例外が起きるようになりました

今まで、その場編集での出力ファイルを閉じるのに失敗しても 検出されていなかったので、編集が正しく終わらずに入力ファイルが壊れることが ありました。 出力ファイルが正しく閉じられなかった場合、例外が発生するようになりました。

正規表現の新しい \b{lb} 境界

lb は Line Break の意味です。 これは(典型的には利用可能な横スペースを越えずに出力できるようにするために) テキストの行のどこが分割に適しているかを決定するための Unicode 特性です。 この能力は長い間 Unicode::LineBreak モジュールによって提供されていましたが、 多くの用途に適している、軽量でカスタマイズできない版がコア Perl に 入るようになりました。

qr/(?[ ])/ は UTF-8 ロケールで動作するようになりました

拡張大かっこ文字クラス は、use locale が有効な場所でもコンパイルに成功するようになりました。 コンパイルされたパターンは標準の Unicode の規則を使います。 実行時ロケールが UTF-8 のものではない場合、警告が発生して、どちらにしろ 標準の Unicode の規則が使われます。 結果は実際にはロケールの影響を受けないため、汚染はされません。

整数シフト (<<>>) はより明示的に定義されました

負数のシフトは逆シフトです: 左シフトは右シフトに、右シフトは左シフトに なります。

ネイティブな整数のビット数(またはそれ以上)シフトするとゼロになります; ただし use integer の基で、「オーバーシフト」が負数に対する右シフトの 場合は、結果は -1 になります(算術シフト)。

今まで、負のシフトとオーバーシフトは未定義でした; C の実装で何が起きるかに 依存していたからです。 例えば、過剰シフトについては一般的な C の振る舞いは「剰余シフト」です:

  1 >> 64 == 1 >> (64 % 64) == 1 >> 0 == 1  # Common C behavior.

  # And the same for <<, while Perl now produces 0 for both.

これらの振る舞いは、基となっている C 実装に関わらず、Perl の基では 定義されたものになりました。 しかし、これはまだネイティブな整数の幅によって制限されることに 注意してください: どれくらいシフトできるか知っている必要があります。 例えば以下のものが使えます:

  use Config;
  my $wordbits = $Config{uvsize} * 8;  # Or $Config{uvsize} << 3.

左シフトでもっと多くのビットが必要なら、例えば bigint プラグマや、CPAN から Bit::Vector モジュールが使えます。

printf と sprintf は制度引数の順番を変えられるようになりました

つまり、sprintf '|%.*2$d|', 2, 3|002| を返すようになりました。 これは既存の並び替え機構(フォーマットフィールド、幅、ベクタ区切りの引数を 並び替えるもの)を拡張します。

SA_SIGINFO 付きの sigaction はより多くのフィールドを提供するようになりました

sigactionSA_SIGINFO フラグを渡すとき、 プラットフォームが対応していれば、ハンドラに渡されるハッシュに errno, status, uid, pid, addr, band フィールドが 含まれるようになりました。

Perl 6 へのシェバンリダイレクト

以前は、シェバンパスがあり、そのパスに "perl" が含まれていない場合、 perl は他のインタプリタにリダイレクトしていました (perlrun 参照)。 Perl 6 との互換性を向上させるために、この振る舞いは、"perl" に引き続いて "6" がある場合もリダイレクトされるように拡張されました。

セキュリティ

mkstemp(3) を呼び出す前に適切な umask を設定するようになりました

5.22 から、perl は mkstemp(3) を呼び出す前に umask を 0600 に設定し、 後で復元するようになりました。 これにより、所有者の読み込みと書き込みのビットだけを残したいという意図とは 逆に、間違って open(2) に、与えられたモードを適用する前に、 これらのビットを取り除くように伝えていました。

(古いバージョンの glibc のように) mkstemp(3) でモード 0666 を使う システムはパーミッション 0066 でファイルを作ります; これにより現在の umask に関わらず誰でも読み書きできるパーミッションのままになります。

これは代わりに umask 0177 を使うことによって修正されました。 [perl #127322]

Win32 パス操作での領域外アクセスは修正されました

これは CVE-2015-8608 です。 さらなる情報については [perl #126755] を 参照してください。

canonpath で汚染が失われることは修正されました

これは CVE-2015-8607 です。 さらなる情報については [perl #126862] を 参照してください。

Win32 crypt() で未初期化メモリにアクセスしないように

短いソルトやソルトの中の不正な文字の検出処理が追加されました。 [perl #126922]

environ から重複した環境変数を削除するようになりました

以前は、一つの環境変数が environ[] に複数回現れると、 %ENV はその名前の最後のエントリを保持していました; 一方典型的な getenv() は最初のエントリを保持します。 %ENVgetenv() が返すものと同じものを保持するようになりました。

次に、environ[] から重複を取り除くようになったので、その名前の設定が %ENV で設定された場合、安全でない値が子プロセスに渡らないようになりました。

[CVE-2016-2381]

互換性のない変更

autoderef 機能は取り除かれました

実験的な autoderef 機能 (push, pop, shift, unshift, splice, keys, values, each をスカラ引数で呼び出せるようにする) は失敗と 判断されました。 これは削除されました; この機能を use しようとすると (または以前は 引き起こされていた experimental::autoderef 警告を無効にしようとすると) 例外が発生するようになりました。

レキシカルな $_ は取り除かれました

my $_ は Perl 5.10 で導入され、明らかな解決法の無いまま多くの混乱を 引き起こしました。 Perl 5.18.0 では、取り除くかあるいはより混乱の少ない(しかし後方互換性のある) 形に再設計するために実験的なものとされました。 その後数年にわたって、代替案は提案されませんでした。 この機能は削除され、コンパイルに失敗するようになりました。

qr/\b{wb}/ は Perl で想定するように調整されました

これは普通の \b の置き換えとして寄り適していましたが、自然言語の パースのためにより良い結果を出すようになりました。 以前は、全ての空白文字の間でマッチングすることを求めている現在の Unicode の 規則に厳密に従っていました。 これは、\b が行っているように、基本的には連続した空白の中では マッチングしなくなりました。 "\b{wb}" in perlrebackslash を参照してください。

正規表現コンパイルエラー

実行時エラーになっていた一部の正規表現パターンは コンパイルできないようになりました。

\p{}\P{} の正規表現パターン構文を使っているほとんどの全ての Unicode 特性は、パターンのコンパイル時に正当性を調べるようになり、不正な場合は プログラムがコンパイルされなくなりました。 以前のリリースでは、この検査はしばしば実行時にまで保留されていました。 エラー検査が実行時からコンパイル時に移動しても、間違ったコードはその時点で 100% 捕捉されます; 一方、以前は間違いは問題が実際に実行されるときに 捕捉されていたので、到達しないコードのものは決して捕捉されていませんでした。

qr/\N{}/use re "strict" の基では認められなくなりました

空の \N{} は無意味ですが、後方互換性のために何もしないものとして 認められていましたが、デフォルトでは廃止予定警告が出ていました。 今回これは実験的機能 "'strict' mode" in re の基では致命的エラーになりました。

ネストした宣言は認められなくなりました

my, our, state 宣言は、別の my, our, state 宣言の中では 行えなくなりました。

例えば、以下のものは致命的エラーになりました:

   my ($x, my($y));
   our (my $x);

[perl #125587]

[perl #121058]

/\C/ 文字クラスは取り除かれました

この正規表現文字クラスは v5.20.0 から廃止予定になり、v5.22.0 から 廃止予定警告が出力されていました。 これはコンパイルエラーになりました。 UTF-8 エンコードされた文字を構成している個々のバイトを調べる必要があるときは、 まず文字列(またはそのコピー)に対して utf8::encode() を使ってください。

chdir('') はホームに chdir しなくなりました

ホームディレクトリへ移動するのに chdir('')chdir(undef) を使うのは perl v5.8 から廃止予定でしたが、失敗するようになりました。 代わりに chdir() を使ってください。

変数名の ASCII 文字は全て表示文字でなければならなくなりました

今まで、ASCII プラットフォームで、非表示 ASCII 制御文字(値 0 から 31 と 127、 つまり C0 制御文字と DELETE) を含む変数名は正当でした。 この使用法は v5.20 から廃止予定になっていましたが、 今回文法エラーになりました。 これらの名前の変数は特別なものとして扱われ、Perl によって現在、あるいは 将来の使用のために予約されています。 このような変数はそれぞれ表記するための他の方法があります。 単一の非表示制御文字の代わりに、$^]${^GLOBAL_PHASE} のように、 キャレットから始まる 2 文字並びが使われます。 詳細は perlvar にあります。 use utf8 が有効でない場所である種の非表示非 ASCII 文字を変数に使うのは まだ正当ですが、賢明ではないことで、廃止予定です(廃止予定警告が出ます)。 このような全ての変数は Perl によって予約されていて、Perl は現在のところ どれも定義していない(しかしいつか注意なしに定義するかもしれません)ので、 コード中でこのようなことをするべきではありません。

$Carp::MaxArgNums のオフバイワン問題が修正されました

$Carp::MaxArgNums は表示する引数の数を保持することになっています。 以前のバージョンでは、文書の説明と異なり、$Carp::MaxArgNums + 1 個の引数を 表示していました。

(?[...]) の中の [...] の中にはブランクとタブのみが許されるようになりました

実験的な拡張大かっこ文字クラスは通常の大かっこ文字クラスを含むことが出来ます。 これらは、バックスラッシュを前置してエスケープしない限り、基本的に空白が 無視されるという点で、通常のものとは異なっていました; 無視される空白はタブ \t と SPACE 文字に制限されるようになりました。 以前は、これは任意の空白でした。 "Extended Bracketed Character Classes" in perlrecharclass を参照してください。

廃止予定

プラットフォームの IV_MAX を越える符号位置の使用は廃止予定になりました

Unicode は 0..0x10FFFF の範囲の符号位置を定義しています。 一部の標準は一時期この値を 2**31 - 1 まで定義していましたが、Perl は プラットフォームが使えるワードに収まるなら、どんなに大きな値でも 許していました。 しかし、プラットフォームの IV_MAX より上の符号位置を使うと 一部の構文、特に tr///、量指定子を含む正規表現パターン、一部の算術および 比較演算子、ループの上限などで壊れていました。 今回、これらの符号位置を使うと、この警告カテゴリをオフにしていない限り、 廃止予定警告が出るようになりました。 IV_MAX は典型的には 32 ビットプラットフォームでは 2**31 -1、 64 ビットでは 2**63-1 です。

0xFF より大きい符号位置を含む文字列に対するビット単位操作は廃止予定です

文字列ビット単位演算子はオペランドをバイトとして扱い、0xFF を超える値は このコンテキストでは無意味です。 エンコードされたバイトに対して演算するには、まず文字列をデコードしてください。 符号位置の数値に対して演算するには、splitmap ord を使ってください。 将来、この警告は例外に置き換えられます。

:utf8 ハンドルに対する sysread(), syswrite(), recv(), send() は廃止予定になりました

sysread(), recv(), syswrite(), send() 演算子は、明示的あるいは 暗黙に :utf8 層を持つ (例えば :encoding(UTF-16LE) を持つ) ハンドルに 対しては廃止予定になりました。

sysread()recv() は現在のところストリームに対して :utf8 フラグのみを使い、実際の層は無視しています。 sysread()recv() は UTF-8 検証を行わないので、不正にエンコードされた スカラを作る可能性があります。

同様に、syswrite()send():utf8 フラグのみを使い、層を 無視します。 フラグが設定されていると、前述の例のように他のエンコーディングの層が あっても、これらは UTF-8 エンコードされた値を書き込みます。

理想的には、これらの演算子は :utf8 状態を完全に無視して、バイトに対してのみ 動作するべきですが、こうすると暗黙に既存のコードを壊すことになります。 これを避けるために、将来のバージョンの perl では :utf8 層を持つハンドルに対して sysread(), recv(), syswrite(), send() を呼び出すときに例外が投げられます。

性能改善

モジュールとプラグマ

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

文書

既存の文書の変更

perlapi

perlcall

perlfunc

perlguts

perllocale

perlmodlib

perlop

perlpolicy

perlreftut

perlrebackslash

perlsub

perlsyn

perltie

perlunicode

perlvar

perlxs

診断メッセージ

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

新しい診断メッセージ

新しいエラー

新しい警告

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

設定とコンパイル

テスト

プラットフォーム対応

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

AmigaOS
Cygwin
EBCDIC
UTF-EBCDIC extended

UTF-EBCDIC は UTF-8 のようなものですが、EBCDIC プラットフォームのための ものです。 64 ビットワードのプラットフォームでは符号位置を 2 ** 64 - 1 まで 表現できるように拡張されました。 これにより UTF-8 と同等になります。 この拡張は、2 ** 30 から 2 ** 31 -1 の範囲(後者は以前の表現可能な 符号位置の最大値)の符号位置の表現に対して互換性のない変更が必要です。 つまり、以前のバージョンの perl 出力された、これらの符号位置を含むファイルは、 今回の変更を含む perl では、変換なしでは読み込めないということです。 私たちはこのようなファイルが存在するとは思っていませんが、もしそのような ファイルを持っているなら、perlbug@perl.org に チケットを登録してください; 私たちはあなたのために変換スクリプトを書きます。

EBCDIC cmp() and sort() fixed for UTF-EBCDIC strings

今まで、両方とも UTF-8 (より正確には UTF-EBCDIC) でエンコードされた文字列の 比較は正しく動作していませんでした。 sort()cmp() を使うので、これも修正されました。

EBCDIC tr/// and y/// fixed for \N{}, and use utf8 ranges

Perl v5.22 では移植性のある正規表現パターンの範囲という概念が導入されました。 移植性のある範囲は、どのプラットフォームで実行されるかに関わらず同じ文字の 集合にマッチングします。 この考え方は tr/// に拡張されました。 tr/// を 参照してください。

これらの操作は use utf8 の基で問題がありましたが、修正されました。

FreeBSD
IRIX
MacOS X
Solaris
Tru64
VMS
Win32
ppc64el
floating point

ppc64el (リトルエンディアン PowerPC の Debian での呼び名) の浮動小数点形式は 正しく検出されるようになりました。

内部の変更

バグ修正の抜粋

既知の問題

Acknowledgements

Perl 5.24.0 は、Perl 5.22.0 以降、77 人の作者によって、 1,800 のファイルに約 360,000 行の変更を加えて、 約 11 ヶ月開発されてきました。

自動生成ファイル、文書、リリースツールを除くと、1,200 の .pm, .t, .c, .h ファイルに約 250,000 行の変更を加えました。

Perl は、活気のあるユーザーと開発者のコミュニティのおかげで 20 年を超えて 繁栄しています。 以下の人々が、Perl 5.24.0 になるための改良に貢献したことが分かっています:

Aaron Crane, Aaron Priven, Abigail, Achim Gratz, Alexander D'Archangel, Alex Vandiver, Andreas König, Andy Broad, Andy Dougherty, Aristotle Pagaltzis, Chase Whitener, Chas. Owens, Chris 'BinGOs' Williams, Craig A. Berry, Dagfinn Ilmari Mannsåker, Dan Collins, Daniel Dragan, David Golden, David Mitchell, Dominic Hargreaves, Doug Bell, Dr.Ruud, Ed Avis, Ed J, Father Chrysostomos, Herbert Breunung, H.Merijn Brand, Hugo van der Sanden, Ivan Pozdeev, James E Keenan, Jan Dubois, Jarkko Hietaniemi, Jerry D. Hedden, Jim Cromie, John Peacock, John SJ Anderson, Karen Etheridge, Karl Williamson, kmx, Leon Timmermans, Ludovic E. R. Tolhurst-Cleaver, Lukas Mai, Martijn Lievaart, Matthew Horsfall, Mattia Barbon, Max Maischein, Mohammed El-Afifi, Nicholas Clark, Nicolas R., Niko Tyni, Peter John Acklam, Peter Martini, Peter Rabbitson, Pip Cet, Rafael Garcia-Suarez, Reini Urban, Renee Baecker, Ricardo Signes, Sawyer X, Shlomi Fish, Sisyphus, Stanislaw Pusep, Steffen Müller, Stevan Little, Steve Hay, Sullivan Beck, Thomas Sibley, Todd Rinaldo, Tom Hukins, Tony Cook, Unicode Consortium, Victor Adam, Vincent Pit, Vladimir Timofeev, Yves Orton, Zachary Storer, Zefram.

これはバージョンコントロール履歴から自動的に生成しているので、ほぼ確実に 不完全です。 特に、Perl バグトラッカーに問題を報告をしてくれた (とてもありがたい)貢献者の 名前を含んでいません。

このバージョンに含まれている変更の多くは、Perl コアに含まれている CPAN モジュール由来のものです。 私たちは Perl の発展を助けている CPAN コミュニティ全体に感謝します。

全ての Perl の歴史的な貢献者のより完全な一覧については、どうか Perl ソース 配布に含まれている AUTHORS を参照してください。

バグ報告

もしバグと思われるものを見つけたら、comp.lang.perl.misc ニュースグループに 最近投稿された記事や https://rt.perl.org/ にある perl バグ データベースを確認してください。 Perl ホームページ、http://www.perl.org/ にも情報があります。

もしまだ報告されていないバグだと確信したら、そのリリースに含まれている perlbug プログラムを実行してください。 バグの再現スクリプトを十分小さく、しかし有効なコードに切りつめることを 意識してください。 バグレポートは perl -V の出力と一緒に perlbug@perl.org に送られ Perl porting チームによって解析されます。

報告しようとしているバグがセキュリティに関するもので、公開されている メーリングリストに送るのが不適切なものなら、バグの報告方法の詳細について "SECURITY VULNERABILITY CONTACT INFORMATION" in perlsec を参照してください。

SEE ALSO

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

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

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

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