NAME

perl5260delta - perl v5.26.0 での変更点

DESCRIPTION

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

注意

このリリースには広範囲に影響を与える三つの更新を含んでいます:

コアの拡張

レキシカルサブルーチンはもはや実験的ではなくなりました

v5.18 で導入された lexical_subs 機能はもはや警告を出さなくなりました。 以前使われていた機能の experimental::lexical_subs 警告カテゴリを無効にした コードはそのまま動作します。 lexical_subs 機能はなんの効果もありません; 全ての Perl コードは、 スコープ内にどの機能宣言があるかどうかに関わらず、レキシカルサブルーチンを 使えます。

インデントされたヒヤドキュメント

ヒヤドキュメントに新しい修飾子 "~" が追加されました; これはパーサに、 閉じ区切り文字として /^\s*$DELIM\n/ を探すように伝えるものです。

以下の文法全てに対応しています:

    <<~EOF;
    <<~\EOF;
    <<~'EOF';
    <<~"EOF";
    <<~`EOF`;
    <<~ 'EOF';
    <<~ "EOF";
    <<~ `EOF`;

"~" 修飾子は、ヒヤドキュメントの各行から区切り文字の前にあるのと同じ 空白を取り除きます。

改行はそのままコピーされ、行の先頭に適切な空白を含んでいない場合は perl は croak します。

例えば:

    if (1) {
      print <<~EOF;
        Hello there
        EOF
    }

これは先頭の空白なしで "Hello there\n" を表示します。

新しい正規表現修飾子 /xx

正規表現を修正するために二つの "x" 文字を指定すると、一つ指定したときの 全ての効果に加えて、大かっこ文字クラスの中の TAB と SPACE は一般的に 無視されるようになるので、次のように可読性を改善するためにこれらを 追加できるようになります: /[ ^ A-Z d-f p-x ]/xx 。 詳細は "/x and /xx" in perlre にあります。

@{^CAPTURE}, %{^CAPTURE}, %{^CAPTURE_ALL}

@{^CAPTURE} は最後のマッチングの捕捉バッファを配列として晒します。 つまり $1${^CAPTURE}[0] です。 これは substr($matched_string,$-[0],$+[0]-$-[0]) のようなコードと 等価でより効果的で、どちらも $matched_string を追跡する必要はありません。 この変数には一文字の等価なものはありません。 他の正規表現マジック変数と同様、この変数の内容は動的であることに 注意してください; マッチングの生存期間を超えて値を補完したい場合、 他の配列にコピーしなければなりません。

%{^CAPTURE}%+ (つまり、名前付き捕捉) と等価です。 より自己説明的であることを覗いて二つの型式に違いはありません。

%{^CAPTURE_ALL}%- (つまり、全ての名前付き捕捉) と等価です。 より自己説明的であることを覗いて二つの型式に違いはありません。

変数へのリファレンスの宣言

実験的機能として、Perl は my(), state(), our(), local() の後にリファレンス演算子を許すようになりました。 この文法は use feature 'declared_refs' で有効にされなければなりません。 これは実験的で、no warnings 'experimental::refaliasing' が有効でない限り、 デフォルトで警告が出ます。 これは主にリファレンスへの代入に使うことを意図しています。 例えば:

    use experimental 'refaliasing', 'declared_refs';
    my \$a = \$b;

より詳しくは "Assigning to References" in perlref を参照してください。

Unicode 9.0 に対応しました

変更の一覧は http://www.unicode.org/versions/Unicode9.0.0/ にあります。 コア Perl と共に出荷されているけれども p5p によって保守されていない モジュールは必ずしも Unicode 9.0 に対応しているとは限りません。 Unicode::Normalize は 9.0 で動作します。

\p{script} を使うと改良された Script_Extensions 特性を使います

Unicode 6.0 は Script (sc) 特性の改良された型式を導入しました; これは Script_Extensions (scx) と呼ばれます。 Perl は、特性を単に \p{script} として指定された場合はこの 改良版を使うようになりました。 これにより、ある文字が特定の用字で使われているかを判定するプログラムが より正確になるはずですが、特に具体的に古い振る舞いが必要なプログラムを 壊す可能性が僅かにあります。 \p{sc=script} のような複合形式の意味は変わりません。 "Scripts" in perlunicode を参照してください。

Perl は、対応しているプラットフォームでは UTF-8 ロケールのデフォルト照合を使うようになりました

一部のプラットフォームでは UTF-8 ロケールでの照合とソートにおいて 妥当な仕事をしています。 Perl はこれらで動作するようになりました。 移植性と完全な制御のために、Unicode::Collate がまだ推奨されますが、 アプリケーションによっては、十分によい結果を得るために何も特別なことを する必要がなくなったかもしれません。 "Category LC_COLLATE: Collation: Text Comparisons and Sorting" in perllocale を参照してください。

埋め込みの NUL 文字を含む文字列に対するよりよいロケール照合

複数レベルの文字ウェイトを持つロケールでは、NUL はより高い優先順位の ものでは無視されるようになりました。 しかし、一部の文字列ではまだいくつかのこつがあります。 "Collation of strings containing embedded NUL characters" in perllocale を 参照してください。

ハッシュと配列の関数のための CORE サブルーチンはリファレンス経由で呼び出せるようになりました

CORE 名前空間でのハッシュと配列の関数 (keys, each, values, push, pop, shift, unshift, splice) は アンパサンド文法 (&CORE::keys(\%hash) とリファレンス経由 (my $k = \&CORE::keys; $k->(\%hash)) で呼び出せるようになりました。 以前はインライン化される場合にのみ可能でした。

64 ビットビルドのための新しいハッシュ関数

短いキーと長いキーのより良いバランスの性能のために複合ハッシュ関数に 切り替えました。

16 バイト以下の短いキーでは、最適化版の One At A Time Hard を使い、 より長いキーでは Siphash 1-3 を使います。 すごく長いキーの場合、これは性能が大きく改善します。 より短いキーではこれは緩やかな改善です。

セキュリティ

@INC からの現在のディレクトリ (".") の除去

perl バイナリは @INC にパスのデフォルト集合を含んでいます。 歴史的に、汚染モード (perl -T) が有効でない限り、最終的なエントリとして カレントディレクトリ (".") も含んでいました。 これは便利ですが、セキュリティ上の問題がありました: 例えば、 カレントディレクトリが(/tmp のように)信頼できない場合、 スクリプトが追加のモジュールを読み込もうとすると、そのディレクトリの下から コードを読み込んで実行する可能性があります。

v5.26 から、"." は汚染モードの場合だけではなく、常にデフォルトで 除去されるようになりました。 これはモジュールのインストールとスクリプトの実行に大きな影響を与えます。

これらの問題を改善するために、以下の新しい機能が追加されました。

新しい型式でソフトウェアが動作するために、スクリプトやモジュールの作者が する必要があるかもしれないことがいくつかあります。

PATHの中のエスケープされたコロンと相対パス

Unix システムでは、Perl は新しいプロセスが開始するときに PATH 環境変数の 全ての相対パスを汚染されているものとして扱います。 以前は、(OS と違って) コロンを逆スラッシュでエスケープすることができ、 結果として PATH に /\:. のようなものが設定されている場合に 相対パスを安全なものとして扱うことができました。 このチェックは修正され、この例では "." を汚染されているものとして 扱うようになりました。

PerlIO デバッグ出力には新しい -Di オプションが必要になりました

これは再帰呼び出しを避けるために PerlIO の中のコードをデバッグするために 使われています。 以前は、perl が setuid 付きで実行されておらず、-T or -t オプションが まだパースされていない場合は、この出力は PERLIO_DEBUG 環境変数で 指定されたファイルに送られていました。

まだこのオプションがパースされていない時点で perl が出力を行うとき、 これにより、たとえ -T オプションが指定されていても、perl が PERLIO_DEBUG の名前のファイルを作ったり上書きすることがありました。

Perl は PerlIO デバッグ出力を行う前に -Di オプションがあることを 要求するようになりました。 デフォルトではこれは stderr に書き込まれますが、 オプションとして PERLIO_DEBUG 環境変数を設定することでファイルに リダイレクトすることができます。

perl が setuid 付きで実行されているか -T オプションが指定されている場合、 PERLIO_DEBUG は無視されて、デバッグ出力はその他の -D オプションと同様 stderr に送られます。

互換性のない変更

正規表現中のエスケープされていないリテラルの "{" 文字はもはや許されなくなりました

LEFT CURLY BRACKET にマッチングするためには "\{""[{]" のように 指定する必要があるようになりました; さもなければ、致命的なパターンコンパイルエラーとなります。 この変更により、将来の言語拡張を可能にします。

これらは v5.16 から廃止予定で、一部の使用法では v5.22 から廃止予定 メッセージが発生していました。 残念ながら、メッセージを発生されるために追加されたコードにはバグがあり、 警告するべき場合の一部で警告できていませんでした。 従って、これらの場合のこの廃止の強制は Perl 5.30 まで延期されますが、 このようなコードはデフォルトでオンの廃止予定メッセージが出力されるように 修正されました。

パターンの先頭の文字や、代替を意味する "|" の直後のような、 リテラルとして以外の意味を予測することができない位置でのリテラルな "{" の使用も起こります。 従って

 qr/{fee|{fie/

というのは {fee{fie のどちらかの文字列にマッチングします。 不必要なコード変更の強制を避けるために、これらの使用法では エスケープする必要はなく、これらに関する警告は発生せず、 現在これを変更する予定はありません。

しかし、"{" をエスケープするのは常に正しく、覚えておくべき単純な規則は、 常にそうすることです。

Unescaped left brace in regex is illegal here を 参照してください。

scalar(%hash) 返り値シグネチャの変更

scalar(%hash) の返り値はもはやハッシュで割り当てられたバケツに関する 情報ではなくなりました。 これは単に使ったキーのカウントを返します。 従ってこれは 0+keys(%hash) と等価です。

後方互換性の型式は、Perl 5.24 以前のが提供する scalar(%hash) と 同じ振る舞いを提供する Hash::Util::bucket_ratio() 経由で提供されます。

左辺値サブルーチンから返される keys

左辺値サブルーチンから返される keys はリストコンテキストでは 代入されなくなりました。

    sub foo : lvalue { keys(%INC) }
    (foo) = 3; # death
    sub bar : lvalue { keys(@_) }
    (bar) = 3; # also an error

これにより、左辺値サブルーチンの場合は、 同様にエラーである (keys %hash) = ...(keys @_) = ... と 一貫性を持つようになりました。 [perl #128187]

${^ENCODING} 機能は除去されました

この変数へ値を代入することと関連付けられている特別な振る舞いは除去されました。 結果として、encoding プラグマのデフォルトモードはもはやサポートされません。 まだ UTF-8 以外のエンコーディングでソースコードを書く必要がある場合は、 CPAN の Filter::EncodingencodingFilter のような ソースフィルタを使ってください。

POSIX::tmpnam() は除去されました

基本的に安全でない tmpnam() インターフェースは Perl 5.22 で廃止予定に なりましたが、今回除去されました。 このような場合、例えば、File::Temp インターフェースを使えます。

require ::Foo::Bar は不正になりました。

以前は、require ::Foo::Bar/Foo/Bar.pm を読み込もうとしていました。 コロン二つで始まる裸の単語の require は全て die するようになりました。

リテラル制御文字変数名はもはや許されなくなりました

変数名には、どのような場合でもリテラル名制御文字を含むことは できなくなりました。 以前は ASCII プラットフォームでの 1 文字名は許されていましたが、 Perl 5.20 から廃止予定でした。 これは $\cT のようなもの (\cT はソースコード中のリテラルな 制御文字 (NAKNEGATIVE ACKNOWLEDGE 文字)) に影響します。

\N{...} 内での NBSP はもはや許されなくなりました

文字の名前にはもはやノンブレークスペースを含むことができなくなりました。 これは Perl 5.22 から廃止予定になっていました。

廃止予定

単体書記素でない文字列区切り文字は廃止予定になりました

Perl が最終的に書記素クラスタ (単一の文字のように見えるけれども複数の文字の 並びであるもの) を文字列区切りとして認めるようになるためには、 それ自身が書記素でない単一区切り文字を許すのを止める必要がありました。 これらは実際のコードではありそうにありません; これらは典型的には ある文字の前に付いているものだからです。

表示可能文字にマッピングされる \cX はもはや廃止予定ではなくなりました

つまり、この機能を除去する予定はありません。 これはまだ警告を出しますが、文法警告が有効の場合のみです。 この機能は元々ニーモニックを持たない非表示文字を表現するための方法を 意図していました (\t\n は二つの非表示文字のための ニーモニックでしたが、ほとんどの非表示文字にはニーモニックがありません)。 しかし、この機能はより明らかに、いくつかの表示可能な文字を指定するために 使われています; http://www.nntp.perl.org/group/perl.perl5.porters/2017/02/msg242944.html を参照してください。

性能改善

モジュールとプラグマ

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

文書

新しい文書

perldeprecation

このファイルは全ての将来の廃止予定、および既に除去された廃止予定の一部を 文書化しています。 この文書の目的は二つです: 何がどのバージョンから除去されたのかを文書化することと、perl の アップグレード後に動作しなくなる機能があるコードを扱う人々へのガイドを 提供することです。

既存の文書の変更

私たちはこの文書にリストされた修正を反映するように文書を 更新しようとしています。 もし見逃しているものに気付いたなら、 perlbug@perl.org にメールを送ってください。

さらに、全ての Usenet への参照は取り除かれ、また以下に抜粋した変更が 行われました:

perlfunc

perlguts

perlhack

perlhacktips

perlinterp

perllocale

perlmod

perlmodlib

perlobj

perlootut

perlop

perlre

perlretut

perlunicode

perlvar

診断メッセージ

新しい診断メッセージ

新しいエラー

新しい警告

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

ツールの変更

c2ph and pstruct

Porting/pod_lib.pl

Porting/sync-with-cpan

perf/benchmarks

Porting/checkAUTHORS.pl

t/porting/regen.t

utils/h2xs.PL

perlbug

設定とコンパイル

テスト

テストはこのリリースでのその他の追加や変更を反映して追加や変更されました。 さらに、以下の実質的な変更が行われました:

プラットフォーム対応

新しいプラットフォーム

NetBSD/VAX

Perl は VAX マシン上の NetBSD でコンパイルできるようになりました。 しかし、このプラットフォームのために、 IEEE-754 浮動小数点数標準を実装しているほとんどのモダンなシステムと 互換性のある浮動小数点数の無限と NaN を実装することはできません。 16 進浮動小数点数 (0x...p[+-]n リテラルと printf %a) も 実装されていません。 make test は、テストの 98% にパスします。

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

Darwin
EBCDIC

いくつかのテストは EBCDIC プラットフォームで動作(またはスキップ)するように 更新されました。

HP-UX

Net::Ping UDP テストは HP-UX ではスキップするようになりました。

Hurd

Hurd のためのヒントが改良され、malloc ラップが有効になり、GNU libc が 使われているように報告します (以前は報告されるときは空文字列でした)。

VAX

VAX 浮動小数点形式は NetBSD で対応されるようになりました。

VMS
Windows
Linux

Linux a.out 実行ファイル型式対応が削除されました。 Linux は 20 年以上 ELF を使っています。

OpenBSD 6

OpenBSD 6 はまだ SA_SIGINFOpid, gid, uid を返すことに 対応していません。 これを考慮するようになりました。

FreeBSD

t/uni/overload.t: FreeBSD でのハングテストをスキップします。

DragonFly BSD

DragonFly BSD は setproctitle() に対応するようになりました。 [perl #130068].

内部の変更

バグ修正の抜粋

既知の問題

以前のリリースからのエラッタ

おくやみ

多作な Perl 作者であり、称賛される Gentoo コミュニティメンバーであった Jon Portnoy (AVENJ) は 2016 年 10 月 10 日に死去しました。 彼に出会い、その知性、機知、精神によって心豊かになった 全ての人々に記憶され、惜しまれました。

Kip Hampton の死去について記すのも大きな悲しみです。 おそらく XML.com での Perl & XML コラムの作者として最もよく知られている彼は、 Apache Foundation プロジェクトになった XML サーバプラットフォームである AxKit のコア貢献者でした。 彼は OSCON の初期に頻繁にスピーカーをしており、 最も最近のものは Madison での YAPC::NA のものでした。 彼は ubu として irc.perl.org に、一般的に #axkit-dahut グループに 参加していました; このグループは 2011 年の YAPC::NA Asheville に 責任を負っていました。

Kip と彼のコミュニティへの絶え間ない貢献はとても惜しまれます。

Acknowledgements

Perl 5.26.0 は、Perl 5.24.0 以降、86 人の作者によって、 2,600 のファイルに約 360,000 行の変更を加えて、 約 13 ヶ月開発されてきました。

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

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

Aaron Crane, Abigail, Ævar Arnfjörð Bjarmason, Alex Vandiver, Andreas König, Andreas Voegele, Andrew Fresh, Andy Lester, Aristotle Pagaltzis, Chad Granum, Chase Whitener, Chris 'BinGOs' Williams, Chris Lamb, Christian Hansen, Christian Millour, Colin Newell, Craig A. Berry, Dagfinn Ilmari Mannsåker, Dan Collins, Daniel Dragan, Dave Cross, Dave Rolsky, David Golden, David H. Gutteridge, David Mitchell, Dominic Hargreaves, Doug Bell, E. Choroba, Ed Avis, Father Chrysostomos, François Perrad, Hauke D, H.Merijn Brand, Hugo van der Sanden, Ivan Pozdeev, James E Keenan, James Raspass, Jarkko Hietaniemi, Jerry D. Hedden, Jim Cromie, J. Nick Koston, John Lightsey, Karen Etheridge, Karl Williamson, Leon Timmermans, Lukas Mai, Matthew Horsfall, Maxwell Carey, Misty De Meo, Neil Bowers, Nicholas Clark, Nicolas R., Niko Tyni, Pali, Paul Marquess, Peter Avalos, Petr Písař, Pino Toscano, Rafael Garcia-Suarez, Reini Urban, Renee Baecker, Ricardo Signes, Richard Levitte, Rick Delaney, Salvador Fandiño, Samuel Thibault, Sawyer X, Sébastien Aperghis-Tramoni, Sergey Aleynikov, Shlomi Fish, Smylers, Stefan Seifert, Steffen Müller, Stevan Little, Steve Hay, Steven Humphrey, Sullivan Beck, Theo Buehler, Thomas Sibley, Todd Rinaldo, Tomasz Konojacki, Tony Cook, Unicode Consortium, Yaroslav Kuzmin, 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 ファイル。