NAME

perl5180delta - perl v5.18.0 での変更点

DESCRIPTION

この文書は v5.16.0 リリースと v5.18.0 リリースの変更点を記述しています。

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

コアの拡張

実験的機能のための新しい機構

新しく追加された実験的機能には以下の決まり文句が必要になりました:

    no warnings "experimental::feature_name";
    use feature "feature_name";  # would warn without the prev line

"experimental" と呼ばれる新しい警告カテゴリができました; 実験的機能が 有効になったときに feature プラグマによって出力される警告が含まれます。

新しく追加された実験的機能はまた、"experimental::" に引き続いて機能の 名前からなる特殊な警告 ID が与えられます。 (計画では、この機構は最終的には全ての警告に拡張され、単にカテゴリ単位でなく、 ここに有効にしたり無効にしたりできるようになります。)

以下のようにすると

    no warnings "experimental::feature_name";

あなたはこの機能の将来の変更や削除が引き起こすかも知れないあらゆる破損に 責任を持つことになります。

(~~my $_ のような) 一部の機能は実験的警告を出力するようになり、 またこれらの警告カテゴリを認識しない perl でも実行するコードでこれらを 無効にしたいかもしれないので、以下のように if プラグマを使うことを 考慮してください:

    no if $] >= 5.018, 'warnings', "experimental::feature_name";

既にある実験的機能もこれらの警告を出力し始めるようになります。 どの機能が実験的と考えられているかに関する情報については perlexperiment を 参照してください。

ハッシュの見直し

perl v5.18.0 でのハッシュの実装の変更は、既存のコードの振る舞いに対して もっとも目に見える変更の一つです。

デフォルトでは、同じキーと値を持つ二つの異なったハッシュ変数は、 以前は同じであったところで異なった順序で内容を提供するようになります。

これらの変更に遭遇したら、きれいにする鍵は、ハッシュは順番のない集合 と いうことを受け入れてそれに従って動作することです。

ハッシュのランダム化

Perl のハッシュ関数が使う種はランダムになりました。 これは、keys(), values(), each() のような関数が返すキー/値の 順序は実行毎に異なるということです。

この変更は、アルゴリズム的複雑性攻撃から Perl ハッシュをより堅牢に することと、ハッシュの順序に依存したバグが発見され、これによってより容易に 突き止められることが分かったからです。

ツールチェーンのメンテナはこのようなことに対してテストするための追加の 基盤に投資したいかもしれません。 テストを連続して何回か実行してから結果を比べることで、コード中の ハッシュ順への依存を見つけ出すのがより容易になります。 作者は Perl のハッシュのキーの順序を安全でない聴衆に公開しないように強く 勧めます。

さらに、それぞれのハッシュは独自の反復順序を持ちます; これにより、現在の ハッシュの種が何かを決定するのが遥かに難しくなります。

新しいハッシュ関数

Perl v5.18 は複数のハッシュ関数への対応を含んでいて、デフォルトが (ONE_AT_A_TIME_HARD に) 変更され、コンパイル時にシンボルを定義することで 異なるアルゴリズムを選べます。 現在の一覧については、INSTALL 文書に当たってください。 Perl v5.18 現在、私たちはデフォルトまたは SIPHASH の使用のみを 推奨していることに注意してください。 そのほか全てはセキュリティ問題があることが知られていて、研究目的のため だけのものです。

PERL_HASH_SEED 環境変数は 16 進数値を取るようになりました

PERL_HASH_SEED は整数を引数として受け付けなくなりました; 代わりに値は "0xf5867c55039dc724" のような、16 進文字列でエンコードされたバイナリ値を 想定するようになりました。 これは整数を超えるかも知れないイン井の長さのハッシュの種に対応する基盤を 作るためです。 (SipHash は 16 バイトの種を使います。)

PERL_PERTURB_KEYS 環境変数が追加されました

PERL_PERTURB_KEYS 環境変数は keys およびその親類に適用されるランダム化の レベルを制御出来ます。

PERL_PERTURB_KEYS が 0 なら、perl はキー順序を全くランダム化しません。 挿入によって keys が変更される機会は以前の perl と同じで、基本的に バケツサイズが変わるときだけです。

PERL_PERTURB_KEYS が 1 なら、perl は再現出来ない方法でキーを ランダム化します。 挿入によって keys が変更される機会はとても高いです。 これはもっとも安全でデフォルトのモードです。

PERL_PERTURB_KEYS が 2 なら、perl はキーを再現可能な方法で ランダム化します。 同じプログラムを繰り返し実行すると毎回同じ出力を生成します。

PERL_HASH_SEED は非デフォルトの PERL_PERTURB_KEYS 設定という意味を 含みます。 PERL_HASH_SEED=0 (正確に一つの 0) に設定すると PERL_PERTURB_KEYS=0 (ハッシュキーランダム化の無効化) という意味を含みます; PERL_HASH_SEED をその他の値に設定すると、PERL_PERTURB_KEYS=2 (決定的で 再現可能なハッシュキーランダム化) という意味を含みます。 明示的に PERL_PERTURB_KEYS を異なったレベルに指定するとこの振る舞いを 上書きします。

Hash::Util::hash_seed() は文字列を返すようになりました

Hash::Util::hash_seed() は整数ではなく文字列を返すようになりました。 これは整数を超えるかも知れない任意の長さのハッシュの種に対応する基盤を 作るためです。 (SipHash は 16 バイトの種を使います。)

PERL_HASH_SEED_DEBUG の出力は変更されました

環境変数 PERL_HASH_SEED_DEBUG は、perl がビルドされたハッシュ関数 および、 そのプロセスで使っている種の 16 進表記の両方を表示するようになりました。 この出力をパースするコードは、存在するはずですが、新しい形式に適合するように 変更しなければなりません: 新しい形式の例は:

    $ PERL_HASH_SEED_DEBUG=1 ./perl -e1
    HASH_FUNCTION = MURMUR3 HASH_SEED = 0x1476bb9f

Unicode 6.2 への更新

Perl は Unicode 6.2 に対応するようになりました。 Unicode 6.1 からの変更点の一覧は http://www.unicode.org/versions/Unicode6.2.0 にあります。

文字名別名は非 Latin1 の範囲の文字も含むようになりました

\N{...}, charnames::vianame() などで使うための文字に対する独自の名前を 定義することができます。 これらの名前は Unicode の範囲全体の文字で構成できるようになりました。 これにより、名前に英語だけでなくネイティブな名前を付けられるようになります。 使える文字にはある種の制限が適用されます (例えば、句読点を含む名前は 定義できません)。 "CUSTOM ALIASES" in charnames を参照してください。

新しい DTrace プローブ

以下の新しい DTrace プローブが追加されました:

${^LAST_FH}

この新しい変数は、最後に読み込んだファイルハンドルへのアクセスを提供します。 これは、$. および、引数なしの tell および eof で使われる ハンドルです。

正規表現集合演算

これは、Unicode::Regex::Set と同様に、符号位置の集合の和集合、 共有集合などに対してマッチングできるようにする 実験的な 機能です。 これはまた拡張 /x 処理を [大かっこ] 文字クラスで使えるようにし、 ユーザー定義特性の代わりとして、それがするよりも複雑な式が可能になりました。 "Extended Bracketed Character Classes" in perlrecharclass を参照してください。

レキシカルサブルーチン

この新機能はまだ 実験的 と考えられています。 有効にするには:

    use 5.018;
    no warnings "experimental::lexical_subs";
    use feature "lexical_subs";

state sub foo, my sub foo, our sub foo でサブルーチンを 宣言できます。 (state sub は、CORE::state sub foo と書かない限り、"state" 機能が 有効であることが必要です。)

state sub は、宣言されたレキシカルスコープから見えるサブルーチンを 作ります。 このサブルーチンは外側のサブルーチンからの呼び出しの間で共有されます。

my sub は、閉じブロックに入る毎に作成されるレキシカルなサブルーチンを 宣言します。 state sub は一般的に my sub より少し高速です。

our sub は、同じ名前のパッケージサブルーチンへのレキシカルな別名を 宣言します。

さらなる情報については、"Lexical Subroutines" in perlsub を参照してください。

計算ラベル

ループ制御 next, last, redo および特殊な dump 演算子は、 実行時にラベルを計算するために使えるように、任意の式を使えるように なりました。 以前は、定数以外の任意の引数は空文字列として扱われていました。

より多くの CORE:: サブルーチン

いくつかの組み込み関数が CORE:: 名前空間のサブルーチンとして追加されました - つまり、以下の、カスタムパーサなしで実装可能なオーバーライドできない キーワードです: defined, delete, exists, glob, pos, protoytpe, scalar, split, study, undef

これらの一部はプロトタイプを持ち、prototype('CORE::...') は オーバーライドできるキーワードとできないキーワードで違いが起きないように 変更されました。 これは prototype('CORE::pos')prototype(&CORE::pos) と一貫性を 持つようにするためです。

負数のシグナル名の kill

kill は常に負のシグナル番号が使えて、その場合単一のプロセスではなく プロセスグループを kill します。 そしてシグナル名も使えました。 しかしこれは一貫性のある振る舞いではありませんでした; なぜなら負の シグナル名は0 として扱われていたからです。 -INT のような負のシグナル名に対応するようになり、-2 を指定されたのと 同じように扱います [perl #112990]。

セキュリティ

関連項目: ハッシュの見直し

"Hash overhaul" の変更の一部はセキュリティを向上させています。 当該の節を参照してください。

文書中の Storable セキュリティ警告

Storable の文書に、信頼できないソースから Storage データを受け付けることの 危険性を読者に警告する章が追加されました。 短く言うと、ある種のデータをデシリアライズすると、モジュールの読み込みや その他のコード実行を引き起こすことがあります。 これは文書化された振る舞いであり求められている振る舞いですが、これは 悪意ある実体からの攻撃が可能です。

Locale::Maketext が不正なテンプレートによってコードインジェクションを許していました

ユーザーが Locale::Maketext に変換文字列を提供できると、現在のプロセスで 利用可能な任意の Perl サブルーチンを起動することができました。

これは修正されましたが、Locale::Maketext 自身や、使っているサブクラスで 提供されている任意のメソッドを起動することが可能です。 これらのメソッドの一つは、Perl コアの sprintf サブルーチンを 起動できます。

まとめると、監査なしにユーザーに変換文字列を提供させるのは悪い考えです。

この脆弱性は CVE-2012-6329 として記録されました。

負数で memset を呼び出さなくなりました

perl の x 文字列繰り返し演算子のカウントを攻撃者が指定できるような 不適切に書かれたコードは、メモリ枯渇サービス拒否攻撃を引き起こしていました。 v5.15.5 以前のバージョンの欠点により、これがヒープバッファオーバーランに 昇格していました; 2.16 以前のバージョンの glibc では、任意のコードの実行を 許す可能性がありました。

これに関わる欠点は識別子 CVE-2012-5195 が割り当てられ、Tim Brown によって 調査されました。

互換性のない変更

関連項目: ハッシュの見直し

"Hash overhaul" の変更の一部は以前のバージョンの perl との 完全な互換性はありません。 当該の節を参照してください。

\N{...} での不明な文字名は文法エラーになりました

以前は、これは警告され、Unicode REPLACEMENT CHARACTER に 置き換えられていました。 Unicode は今ではこのような状況では文法エラーにすることを勧めています。 また、以前の振る舞いは一部の混乱させる警告と振る舞いを引き起こし、 REPLACEMENT CHARACTER は一部の不明な文字の代わり以外に使い道がないので、 この問題を持つコードはバグがちです。

以前は廃止予定だった \N{} 文字名別名での文字はエラーになるようになりました

v5.12.0 から、ユーザー定義 \N{...} 文字名での一部の文字の使用は 廃止予定になりました。 これらは文法エラーになりました。 例えば、以下のように数値で始まる名前はエラーになります

 my $undraftable = "\N{4F}";    # Syntax error!

あるいは名前のどこかにカンマがある場合もそうです。 "CUSTOM ALIASES" in charnames を参照してください。

\N{BELL} は U+0007 ではなく U+1F514 を参照するようになりました

Unicode 6.0 は "BELL" という名前を、伝統的に使われていたものと異なる 符号位置に再利用しました。 Perl v5.14 から、この名前を使っても U+0007 を参照したままでしたが、 廃止予定警告が出ていました。 今では、"BELL" は U+1F514 を参照し、U+0007 の名前は "ALERT" になりました。 charnames の全ての関数はこれに対応するように更新されました。

正規表現大かっこ文字クラス中の複数文字大文字小文字無視マッチングの新しい制限

Unicode は、正規表現で単一の文字が大文字小文字を無視して複数の文字に マッチングできるとき、自動的に大文字小文字を扱うという以前の推奨を 取り下げました; 例えば、LATIN SMALL LETTER SHARP S と並び ss です。 これは、どのような状態でもこれを正しく行うのは不可能であるということが 分かったからです。 Perl はこれをできるだけしようとするので、引き続きそうします。 (私たちはこれをオフにするオプションを考慮しています。) しかし、[大かっこ] 文字クラスでこのようなマッチングが起きるときの新しい制限が 追加されていました。 人々は /[\0-\xff]/i なものを指定して、二文字並び ss にマッチングして 驚いていました (LATIN SMALL LETTER SHARP S はこの範囲にあるからです)。 この振る舞いは範囲ではなく特性を使った場合と一貫性がありません: \p{Block=Latin1} は LATIN SMALL LETTER SHARP S も含みますが、 /[\p{Block=Latin1}]/iss にマッチングしません。 新しい規則は、大かっこ文字クラス内での複数文字大文字小文字無視マッチングに 関するもので、文字は明示的に一覧に挙がっていなければならず、範囲の 端点であってはなりません。 これはより密接に驚き最小の原則に従います。 "Bracketed Character Classes" in perlrecharclass を参照してください。 バグ [perl #89774] はこの変更の一部として修正され、以前の振る舞いが 完全に動作することを妨げることに注意してください。

変数名と識別子の明示的な規則

不注意により、5.16 での単一文字の変数名は完全に無制限になっていました。 これは様々な種類の狂気への扉を開いていました。 v5.18 から、その他の識別子の規則に従って、さらに \p{POSIX_Punct} 特性に マッチングする文字を受け付けます。

もはや中かっこありと中かっこなしで指定された識別子のパースに違いは ありません。 例えば、perl は (シングルコロン付きの) ${foo:bar} は許していましたが $foo:bar は許していませんでした。 今では両方とも単一のコードパスで扱われ、どちらも同じ方法で扱われます: どちらも禁止されます。 この変更は許可されるリテラルな識別子の範囲に関するものであり、その他の式には 関係ないことに注意してください。

垂直タブは空白になりました

なぜ \s で垂直タブ \cK にマッチングしないのか、誰も 思い出せませんでした。 今ではマッチングします。 この文字自体がとても稀なので、破損はほとんど起こらないと想定されています。 つまり、これは以下を意味します:

正規表現中の \s は全ての状況で垂直タブにマッチングするようになりました。

正規表現中のリテラルな垂直タブは、/x 修飾子が使われると無視されます。

単独または他の空白と混ぜられた先頭の垂直タブは、文字列を数値として 解釈するときに無視されるようになりました。 例えば:

  $dec = " \cK \t 123";
  $hex = " \cK \t 0xF";

  say 0 + $dec;   # was 0 with warning, now 123
  say int $dec;   # was 0, now 123
  say oct $hex;   # was 0, now  15

/(?{})//(??{})/ は大幅に再作業されました

この機能の実装はほとんど完全に書き直されました。 主な目的はバグの修正ですが、一部の振る舞い、特にレキシカル変数に関連する ものは変更されました。 これは "Selected Bug Fixes" の節でより完全に記述されています。

置換のより厳密なパース

パーサが s///e を以下のようにパースすることを悪用することはもはや できなくなりました:

    %_=(_,"Just another ");
    $_="Perl hacker,\n";
    s//_}->{_/e;print

given はグローバルな $_ のエイリアスになりました

given は、ちょうど foreach と同様に、暗黙のレキシカルな $_ ではなく グローバルな $_ を引数への別名とするようになりました。 しかし、(再び foreach と同様に) レキシカルな $_ がスコープ内にあれば レキシカルな $_ を使います [perl #114020]。

スマートマッチングの仲間の機能は実験的なものになりました

v5.10.0 で追加され、v5.10.1 で大きく改訂されたスマートマッチングは、 いつも不満な点でした。 これを有用にする方法はいくつかありますが、問題があり、Perl のユーザーと 実装者の両方を混乱させることがわかっています。 この問題をもっともよく対処するための多くの提案がありました。 スマートマッチングは将来変更されるか削除されることはほぼ確実です。 現在の振る舞いに依存することは勧められません。

パーサが ~~, given, when を見つけたときに警告が 発生するようになりました。 これらの警告を無効にするには、適切なスコープに以下の行を追加できます:

  no if $] >= 5.018, "experimental::smartmatch";

しかし、振る舞いは安定するまでに再び変更されるかもしれないので、これらの 機能の使用を置き換えることを考慮してください。

レキシカルな $_ は実験的なものになりました

これが Perl v5.10 で導入されてから、明らかな解決方法のない多くの混乱を 引き起こしていました:

レキシカルな $_ が復旧可能であるというのは私たちの希望ですが、これは 振る舞いの変更を引き起こすでしょう。 安定するまで、注意して使ってください。

$/ = \N での readline() は N バイトではなく N 文字を読み込むようになりました

以前は、encoding のような I/O 層を使ってストリームから読み込むとき、 readline() 関数、あるいは <> 演算子と知られているものは、 最上位の層から N バイト読み込んでいました。 [perl #79960]

代わりに N 文字読み込まれるようになりました。

追加の層なしでストリームから読み込むときには振る舞いは変わりません; なぜなら バイトは正確に文字にマッピングされるからです。

オーバーライドされた glob は一つの引数を渡すようになりました

glob をオーバーライドしたものは、呼び出し元を識別するマジカルで 文書化されていない第 2 引数を渡されていました。 CPAN でこれを使っているものはなく、バグ修正の邪魔になるので、 取り除かれました。 どうしても呼び出し元を識別する必要があるなら、CPAN の Devel::Callsite を 参照してください。

ヒヤドキュメントのパース

クォート風演算子の内側のヒヤドキュメントの本体は、常に "<<foo" マーカーの 次の行から始まるようになりました。 以前は、クォート風演算子を含む行の次の行から始まると文書化されていましたが、 これは時々しか正しくありませんでした [perl #114040]。

英数字演算子は正規表現の閉じ区切り文字から分離されなければならなくなりました

もはや以下のようには書けなくなりました:

 m/a/and 1

代わりに以下のように書かなければなりません

 m/a/ and 1

演算子を正規表現の閉じ区切り文字と分けるための空白が必要です。 空白がないと、Perl v5.14.0 から廃止予定警告が出ます。

qw(...) はもはやかっことして使えなくなりました

qw リストは、常にかっこで囲まれているとパーサが考えるように騙すために 使われていました。 これにより、実際には foreach $x (qw(a b c)) {...} と書くべきところで foreach $x qw(a b c) {...} のような驚かされる構文が可能でした。 これは時々構文解析器を間違った状態にするので、完全には動作せず、 許されると想定するかも知れない似たような foreach qw(a b c) {...} は 全く動作しませんでした。

qw のこの副作用は撤廃されました。 これは Perl v5.13.11 から廃止予定でした。 文法が必要としているところではどこでも、実際のかっこを使うことが 必要になりました。

レキシカルとデフォルトの警告の相互作用

何らかのレキシカル警告をオンにするとき、レキシカル警告が既に有効でなければ、 まず全てのデフォルト警告を無効にしていました:

    $*; # deprecation warning
    use warnings "void";
    $#; # void warning; no deprecation warning

debugging, deprecated, glob, inplace, malloc の警告カテゴリは、 レキシカルな警告がオンになったときにも (もちろん no warnings で オフにしない限り) オンのままになりました。

これは、警告が出ていなかったコードで廃し予定警告を引き起こすかもしれません。

これらはデフォルト警告からなるカテゴリのみです。 その他のカテゴリのデフォルト警告はやはり use warnings "category" で 無効化されます; なぜなら個々の警告を制御する基盤はまだないからです。

state subour sub

歴史上の偶然により、state subour sub は普通の sub と 等価だったため、our sub { ... } で無名サブルーチンが作れていました。 これらは "lexical_subs" 機能の外側では出来なくなりました。 "lexical_subs" 機能の元ではこれらは "Lexical Subroutines" in perlsub に 記述されている新しい意味を持ちます。

環境変数に保管された定義値はバイト文字列に強制されました

環境変数に保管される値は常に文字列化されていました。 このリリースから、バイト文字列にだけ変換されます。 まず、文字列だけに強制されます。 それから、文字列が utf8 で utf8::downgrade() の等価物が動作するなら、 結果が使われます; さもなければ、utf8::encode() の等価物が使われ、 ワイド文字に関する警告が出力されます ("Diagnostics")。

読み込めないファイルに対する require は die します

require が読み込めないファイルに遭遇すると、die するようになりました。 以前はそのファイルを無視して、@INC のディレクトリの検索を続けていました [perl #113422]。

gv_fetchmeth_* と SUPER

様々な gv_fetchmeth_* XS 関数は、名前が ::SUPER で終わるパッケージを 特別扱いしていました。 Foo::SUPER パッケージでのメソッド検索は Foo パッケージでの SUPER メソッドとして扱われていました。 これはもはや起こりません。 SUPER を検索するには、Foo スタッシュと GV_SUPER フラグを 渡してください。

split の最初の引数はより一貫性を持って解釈されるようになりました

v5.17 の初期でのいくつかの変更の後、split の振る舞いは単純化されました: PATTERN 引数が一つのスペースを含む文字列として評価される場合、一つの スペースを含んでいる リテラルな 文字列であったように扱われます。

廃止予定

モジュールの削除

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

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

(稀な例外はありますが) 使い続けることを奨励されている素晴らしいモジュールが あることに注意してください。 これらがコアに含まれなくなったのは、普通はその設計を考慮したためではなく、 主に完全に機能する、CPAN が使える Perl のインストールのブートストラッピングへの 必要性によって決まります。

encoding

このプラグマの使用は強く非推奨です。 これはソーステキストのエンコーディングと I/O データのエンコーディングを 融合し、ソーステキストのエスケープシーケンスを再解釈し(疑問のある選択です)、 全ての実行時の文字列の扱いに UTF-8 バグを導入します。 これは意図的に壊れていて、直すにはほど遠いです。

ソーステキストに非 ASCII リテラル文字を使うには、どうか utf8 を 参照してください。 テキストの I/O データの扱いについては、どうか Encodeopen を 参照してください。

Archive::Extract
B::Lint
B::Lint::Debug
CPANPLUS および含まれている全ての CPANPLUS::* モジュール
Devel::InnerPackage
Log::Message
Log::Message::Config
Log::Message::Handlers
Log::Message::Item
Log::Message::Simple
Module::Pluggable
Module::Pluggable::Object
Object::Accessor
Pod::LaTeX
Term::UI
Term::UI::History

廃止予定のユーティリティ

以下のユーティリティは、関連するモジュールが廃止予定なので、将来のリリースで コア配布から削除されます。 適切な CPAN 配布からは利用可能なままです。

cpanp
cpanp-run-perl
cpan2dist

これは CPANPLUS 配布の一部です。

pod2latex

これは Pod::LaTeX 配布の一部です。

PL_sv_objcount

このインタプリタグローバルな変数はインタプリタ内の Perl オブジェクトの総数を 記録するために使われていました。 これはもはや保守されず、Perl v5.20 で削除される予定です。

/x では追加で五つの文字にエスケープが必要になりました

正規表現パターンが /x 付きでコンパイルされるとき、Perl は SPACE や TAB などの 6 文字を無視する空白として扱います。 しかし、Unicode は 11 文字をそう扱うように勧めています。 私たちはこれを将来の Perl バージョンで従う予定です。 当面の間、抜けている文字の使用は、オフにされていない限り廃止予定警告を 引き起こします。 五つの文字とは以下の通りです:

    U+0085 NEXT LINE
    U+200E LEFT-TO-RIGHT MARK
    U+200F RIGHT-TO-LEFT MARK
    U+2028 LINE SEPARATOR
    U+2029 PARAGRAPH SEPARATOR

予期しない空白付きのユーザー定義文字名

末尾や連続した空白を含むユーザー定義文字名はおそらくタイプミスです。 多すぎる空白を含むことはなさそうという仮定の下、このようなものを定義すると 警告が出るようになりました。

さまざまな XS から呼び出せる関数が廃止予定になりました

文字をクラス分けする全ての関数は将来のバージョンの Perl から削除されるので、 使うべきではありません。 これらのいずれかを使っているファイルをコンパイルすると、 (例えば gcc のような) 関連する C コンパイラは警告を生成します。 これらは公的な使用を想定していません; これらのほとんどに対しては、等価でより 高速なマクロがあります。

"Character classes" in perlapi を参照してください。 完全な一覧は:

is_uni_alnum, is_uni_alnumc, is_uni_alnumc_lc, is_uni_alnum_lc, is_uni_alpha, is_uni_alpha_lc, is_uni_ascii, is_uni_ascii_lc, is_uni_blank, is_uni_blank_lc, is_uni_cntrl, is_uni_cntrl_lc, is_uni_digit, is_uni_digit_lc, is_uni_graph, is_uni_graph_lc, is_uni_idfirst, is_uni_idfirst_lc, is_uni_lower, is_uni_lower_lc, is_uni_print, is_uni_print_lc, is_uni_punct, is_uni_punct_lc, is_uni_space, is_uni_space_lc, is_uni_upper, is_uni_upper_lc, is_uni_xdigit, is_uni_xdigit_lc, is_utf8_alnum, is_utf8_alnumc, is_utf8_alpha, is_utf8_ascii, is_utf8_blank, is_utf8_char, is_utf8_cntrl, is_utf8_digit, is_utf8_graph, is_utf8_idcont, is_utf8_idfirst, is_utf8_lower, is_utf8_mark, is_utf8_perl_space, is_utf8_perl_word, is_utf8_posix_digit, is_utf8_print, is_utf8_punct, is_utf8_space, is_utf8_upper, is_utf8_xdigit, is_utf8_xidcont, is_utf8_xidfirst.

さらに、以下の三つの決して正しく動作しない関数が廃止予定になりました: to_uni_lower_lc, to_uni_title_lc, and to_uni_upper_lc.

正規表現中の逆スラッシュのある種の稀な使用法は廃止予定になりました

Perl が正規表現パターンのメタ文字として認識する 3 組の文字があります: {}, [], () です。 これらは以下のように区切り文字としても使えます:

  m{foo}
  s(foo)(bar)

これらはメタ文字なので、正規表現では特別な意味があります; そして これらの文字を区切り文字として使ったパターンの中で使うとき、逆スラッシュを 前置して通常の意味にすることで特別な意味をなくすということができないことが 分かりました。 例えば、以下のものは

  m{foo\{1,3\}}

逆スラッシュは振る舞いを変更せず、これは "f o" に引き続いて 1 から 3 文字の "o" にマッチングします。

メタ文字として解釈される場所でのこのような使用法は極めて稀です; 例えば、 CPAN 全ての中で全く使われていません。 従って、この廃止予定はコードにほとんど影響を与えないはずです。 しかし、逆スラッシュが意味があるように将来の Perl バージョンの振る舞いを 変更したときに、このようなコードは変更する必要があり、黙って既存のコードを 壊す恐れがないように、ここで注意しておきます。

正規表現でトークン (? または (* を分割する

(?...) 正規表現構文で (? が空白で分割されていると廃止予定警告が 発生するようになりました。 (*VERB...) 構文で (* が分割されている場合も同様です。

PerlIO 以前の IO 実装

理論的には、今のところ PerlIO なしで perl をビルドすることは可能です。 代わりに、stdio か sfio のラッパーを使います。 実際には、これはかなり不便です。 あまりテストされておらず、IO 層や(従って)Unicode に対応しておらず、 perl としていいものではありません。 PerlIO なしのビルドおそらく次のバージョンの perl で削除されます。

PerlIO は、stdio を使いたいなら stdio 層に対応しています。 同様に sfio 層も、もし必要なら将来作成されるかもしれません。

将来の廃止予定

性能改善

モジュールとプラグマ

新しいモジュールとプラグマ

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

更新の完全な一覧は、以下を実行してください:

  $ corelist --diff 5.16.0 5.18.0

5.16.0 の部分は好みのバージョンに置き換えることもできます。

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

文書

既存の文書の変更

perlcheat

perldata

perldiag

perlfaq

perlfunc

perlop

診断メッセージ

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

新しい診断メッセージ

新しいエラー

新しい警告

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

ツールの変更

h2xs

設定とコンパイル

テスト

プラットフォーム対応

中断したプラットフォーム

BeOS

BeOS は Be Inc によって開発されたパソコンのためのオペレーティングシステムで、 当初は BeBox ハードウェアのためのものです。 Haiku OS は BeOS のオープンソース代替品/続編で、この perl 版は最新で活発に 保守されています。

UTS Global

UTS グローバルに関する対応コードは削除されました。 UTS は Amdahl によって作成されたメインフレーム版の System V で、その後 UTS Global によって販売されました。 この移植版は Perl v5.8.0 以前から触れられておらず、UTS Global は もうありません。

VM/ESA

VM/ESA 対応は削除されました。 この移植版は IBM が 2002 年 3 月に対応を終了した 2.3.0 で テストされていました。 2.4.0 は 2003 年 6 月に対応を終了し、Z/VM に取って代わられました。 Z/VM の現在のバージョンは V6.2.0 で、2015/04/30 に対応を終了することが 予定されています。

MPE/IX

MPE/IX 対応は削除されました。

EPOC

EPOC に関連する対応コードは削除されました。 EPOC は Psion によって開発されたモバイルデバイス向けのオペレーティング システムファミリーです。 これは Symbian の祖先です。 この移植版が最後に更新されたのは 2002 年 4 月です。

Rhapsody

Rhapsody 対応は削除されました。

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

AIX

Configure は xlC を使うときに AIX の CC フラグに常に -qlanglvl=extc99 を 追加するようになりました。 これにより C99 を仮定している多くの XS ベースのモジュールをコンパイルするのが より容易になります [perl #113778]。

clang++

Perl v5.15.7 から clang++ でコンパイルするのを妨げるコンパイラのバグを 回避するようになりました [perl #112786]。

C++

Perl コアを C++ としてコンパイルするとき(これは半対応状態です)、 mathom 関数は extern "C" でコンパイルされるようになれるようになりました; 適切なバイナリ互換性を確実にするためです。 (しかし、バイナリ互換性は、これが問題になるような状況では一般的には 保証されません。)

Darwin

-Dusemorebits を使ったビルドを修正するために、8 バイト境界のアライメントの ハードコーディングを止めました。

Haiku

Perl は Haiku R1 Alpha 4 そのままで動作するようになったはずです。

MidnightBSD

libc_r は最近のバージョンの MidnightBSD から取り除かれ、より古い バージョンは pthread でよりよく動作します。 0.4-CURRENT でスレッドを有効にしたときのビルドエラーを修正するために、 スレッドは pthread を使って有効化されるようになりました。

Solaris

Configure で、Solaris で対応していないフラグ付きの sed コマンドを 実行しないようになりました。

VMS

Win32

WinCE

WinCE でのビルドは再び可能になりましたが、クリーンなビルドを完全に 復元するにはさらなる作業が必要です。

内部の変更

バグ修正の抜粋

既知の問題

お悔やみ

韓国ソウルの 24 才 Hojung Yoon (AMORETTE) は、ラマの人形およびサイン入り TIMTOADY カードと共に長い眠りにつきました。 彼は素晴らしい若手 Perl 5 & 6 ハッカーであり、Seoul.pm の献身的な メンバーでした。 彼は Perl をプログラムし、Perl を話し、Perl を食べ、Perl を愛していました。 私たちは、彼が今でもどこかで彼の壊れた IBM ラップトップで Perl で プログラミングしていると信じています。 お悔やみを申し上げます。

Acknowledgements

Perl v5.18.0 は、Perl v5.16.0 以降、113 人の作者によって、 2,100 のファイルに約 400,000 行の変更を加えて、 約 12 months開発されてきました。

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

Aaron Crane, Aaron Trevena, Abhijit Menon-Sen, Adrian M. Enache, Alan Haggai Alavi, Alexandr Ciornii, Andrew Tam, Andy Dougherty, Anton Nikishaev, Aristotle Pagaltzis, Augustina Blair, Bob Ernst, Brad Gilbert, Breno G. de Oliveira, Brian Carlson, Brian Fraser, Charlie Gonzalez, Chip Salzenberg, Chris 'BinGOs' Williams, Christian Hansen, Colin Kuskie, Craig A. Berry, Dagfinn Ilmari Mannsåker, Daniel Dragan, Daniel Perrett, Darin McBride, Dave Rolsky, David Golden, David Leadbeater, David Mitchell, David Nicol, Dominic Hargreaves, E. Choroba, Eric Brine, Evan Miller, Father Chrysostomos, Florian Ragwitz, François Perrad, George Greer, Goro Fuji, H.Merijn Brand, Herbert Breunung, Hugo van der Sanden, Igor Zaytsev, James E Keenan, Jan Dubois, Jasmine Ahuja, Jerry D. Hedden, Jess Robinson, Jesse Luehrs, Joaquin Ferrero, Joel Berger, John Goodyear, John Peacock, Karen Etheridge, Karl Williamson, Karthik Rajagopalan, Kent Fredric, Leon Timmermans, Lucas Holt, Lukas Mai, Marcus Holland-Moritz, Markus Jansen, Martin Hasch, Matthew Horsfall, Max Maischein, Michael G Schwern, Michael Schroeder, Moritz Lenz, Nicholas Clark, Niko Tyni, Oleg Nesterov, Patrik Hägglund, Paul Green, Paul Johnson, Paul Marquess, Peter Martini, Rafael Garcia-Suarez, Reini Urban, Renee Baecker, Rhesa Rozendaal, Ricardo Signes, Robin Barker, Ronald J. Kimball, Ruslan Zakirov, Salvador Fandiño, Sawyer X, Scott Lanning, Sergey Alekseev, Shawn M Moore, Shirakata Kentaro, Shlomi Fish, Sisyphus, Smylers, Steffen Müller, Steve Hay, Steve Peters, Steven Schubiger, Sullivan Beck, Sven Strickroth, Sébastien Aperghis-Tramoni, Thomas Sibley, Tobias Leich, Tom Wyant, Tony Cook, Vadim Konovalov, Vincent Pit, Volker Schatz, Walt Mankowski, Yves Orton, Zefram.

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

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

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

バグ報告

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

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

もし報告しようとしているバグがセキュリティに関するもので、公開されている メーリングリストに送るのが不適切なものなら、 perl5-security-report@perl.org に送ってください。 このアドレスは、問題の影響を評価し、解決法を見つけ、Perl が対応している 全てのプラットフォームで問題を軽減または解決するパッチをリリースするのを 助けることが出来る、全てのコアコミッタが参加している非公開の メーリングリストになっています。 このアドレスは、独自に CPAN で配布されているモジュールではなく、 Perl コアのセキュリティ問題だけに使ってください。

SEE ALSO

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

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

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

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