NAME

perldeprecation - Perl の廃止予定の一覧

DESCRIPTION

この文書の目的は、Perl で何が廃止予定になったか、どのバージョンで 廃止予定の機能が消滅したか、あるいは既に削除された機能については、 いつ削除されたかを文書化することです。

この文書は、廃止予定の機能についてどんな代替案が利用可能かについて 議論しようとしています。

廃止予定の機能は、削除される予定の Perl のバージョン毎に グループ分けされています。

Perl 5.34

Perl 5.34 で計画されている廃止予定や致命的エラー化はありません。

Perl 5.32

レキシカル変数からの定数が潜在的にどこからでも変更可能

次のように書きました:

    my $var;
    $sub = sub () { $var };

しかし $var はどこかで参照されていて、 sub 式が評価された後に変更されるかもしれません。 これは、明示的に他の場所から変更されたり ($var = 3)、 変数を変更するかもしれないしされないかもしれない printfmap のような演算子やサブルーチンに 渡されることによります。

伝統的に、Perl はこの時点で変数の値を捕捉して、 サブルーチンをインライン化可能な定数に変えます。 変数が他の場所で変更できる場合、これはクロージャの振る舞いを壊します; サブルーチンはその値ではなく変数そのものを捕捉するからです; 従って、将来の変数への変更はサブルーチンの返り値に反映されます。

サブルーチンをインライン化可能にすることを意図している場合は、 おそらくコピーすることによって、変数がどこからも 参照されていないようにしてください:

    my $var2 = $var;
    $sub = sub () { $var2 };

このサブルーチンを、閉じた変数の将来の変更を反映するクロージャにしたい場合は、 明示的な return を追加してください:

    my $var;
    $sub = sub () { return $var };

この使用法は廃止予定で、Perl 5.32 以降ではもはや許されません。

vec の引数として 0xFF を超える符号位置の文字列の使用

vec はその文字列引数をビット列として見ます。 0xFF を超える符号位置を含む文字列は意味がありません。 この使用法は Perl 5.28 で廃止予定になり、 Perl 5.32 で削除されました。

ビット単位文字列演算子での 0xFF を超える符号位置の使用

ビット単位文字列演算子 &, |, ^, ~ は、そのオペランドを バイトの文字列として扱います。 従って0xFF を超える値は意味がありません。 これらの恥部は Perl 5.24 から廃止予定で、5.28 で致命的エラーになりましたが、 ワイド文字が最終結果に影響を与えない場合、 廃止予定警告は出力されず、従って正当なまま残っていることが分かりました。 今回、こえらの全ては致命的エラーか廃止予定警告が出るようになり、 残っている正当な場合は 5.32 で致命的エラーになりました。

この例は:

 "" & "\x{100}"

ワイド文字は & 演算では使われません; 左オペランドはより短いからです。 どちらにしろこれは例外を投げるようになりました。

hostname() は引数を取りません

Sys::Hostname モジュールの hostname() 関数は、 引数なしで呼び出されると常に文書化されていました。 歴史的にはこれは強制されておらず、実際に引数を受け付けて、 全て無視していました。 結果として、引数が何か有用であるという間違った印象を 一部のユーザーに与えていました。 これらのバグを避けるために、この関数はより厳密になりました。 引数を渡すのは Perl 5.28 で廃止予定になり、 Perl 5.32 で致命的エラーになりました。

正規表現中のエスケープされない左中かっこ

正規表現パターン中でリテラルな { 文字 (U+007B LEFT CURLY BRACKET) にマッチングしたい場合、 覚えるべき単純な規則は、何らかの形でそれぞれのリテラルな実体を エスケープすることです。 一般的に最も簡単な方法は、\{ のように逆スラッシュを前置するか、 大かっこで囲む ([{]) ことです。 パターン区切り文字も中かっこなら、例えばパーサの混乱を避けるために、 マッチングする右中かっこ (}) もエスケープするべきです。

 qr{abc\{def\}ghi}

リテラルな { 文字のエスケープの強制は、 Perl 言語が将来のリリースで様々な方法で拡張できるようにするためにします。 既存のコードを不必要に壊すのを避けるために、この制限は、 { をリテラルとして使うことと衝突する拡張がなさそうな部分では 強制されません。 左中かっこがリテラルに取られているときの非廃止予定警告は、 それが混乱するかも知れない文脈で発生します。

{ のリテラルな使用は Perl 5.20 に廃止予定になり、 一部の使用についてはその時から廃止予定警告が出始めています。 これらの場合は Perl 5.26 で致命的エラーになりました。 見過ごしにより、全てのリテラルな { の使用に対して廃止予定警告を 出していませんでした。 一部の場合は Perl 5.26 で警告を始め、Perl 5.30 で致命的エラーになりました。 その他の場合は Perl 5.28 で始め、5.32 で致命的エラーになりました。

XS コードで、UTF-8 を扱う様々なマクロの使用

これらのマクロは Perl 5.32 以前より一つ追加の引数が必要になりました。 それぞれの最後の引数は、これを超えて入力が読み込まれない、最初の引数で 指定された文字列へのポインタです。 これはバッファの末尾を超えて読み込む可能性を防ぎます。 isALPHANUMERIC_utf8, isASCII_utf8, isBLANK_utf8, isCNTRL_utf8, isDIGIT_utf8, isIDFIRST_utf8, isPSXSPC_utf8, isSPACE_utf8, isVERTWS_utf8, isWORDCHAR_utf8, isXDIGIT_utf8, isALPHANUMERIC_LC_utf8, isALPHA_LC_utf8, isASCII_LC_utf8, isBLANK_LC_utf8, isCNTRL_LC_utf8, isDIGIT_LC_utf8, isGRAPH_LC_utf8, isIDCONT_LC_utf8, isIDFIRST_LC_utf8, isLOWER_LC_utf8, isPRINT_LC_utf8, isPSXSPC_LC_utf8, isPUNCT_LC_utf8, isSPACE_LC_utf8, isUPPER_LC_utf8, isWORDCHAR_LC_utf8, isXDIGIT_LC_utf8, toFOLD_utf8, toLOWER_utf8, toTITLE_utf8, toUPPER_utf8.

Perl 5.26 から、追加の引数の機能は、 これらのそれぞれに対応するベース名に _safe を追加した形の名前のマクロを 使うことによって利用可能です。 これらの機能に変更はありません。 例えば、isDIGIT_utf8_safeisDIGIT_utf8 に対応し、 これらは同様に振る舞うようになりました。 これら全ては "Character case changing" in perlapi"Character classification" in perlapi に文書化されています。

この変更は本来 5.30 に計画されていましたが、5.32 まで延期されました。

File::Glob::glob() は削除されました

File::Glob は、単に bsd_glob を呼び出す関数 glob を持っています。

File::Glob::glob() は Perl 5.8 に廃止予定になりました。 廃止予定メッセージは Perl 5.26 から出力されていて、 この関数は Perl 5.30 で消滅しました。

File::Glob::glob() を使っているコードは代わりに File::Glob::bsd_glob() を呼び出すべきです。

Perl 5.30

$* はもはや対応しません

Perl 5.10 より前では、$* に真の値を設定すると、 一つの文字列中の複数行マッチングをグローバルに有効にします。 この過去からの遺物は 5.10 で特別な意味を失いました。 将来の特別な意味のために変数を空けるために、 この変数の使用は Perl 5.30 で致命的エラーになります。

複数行マッチングを有効にするためには、 (おそらく /s と組み合わせて) /m 正規表現修飾子を使うべきです。 これはマッチング毎で設定したり、use re '/m' で (ファイル全体を含む) レキシカルスコープ毎に設定したり出来ます。

$# はもはや対応しません

この変数は特別な意味を持っていました -- print したときにいくつフォーマットするかを制御するために使われていました。 このほとんど使われない機能は Perl 5.10 で削除されました。 将来の特別な意味のために変数を空けるために、 この使用は Perl 5.30 で致命的エラーになります。

print したときにいくつフォーマットされるかを指定するには、 代わりに printfsprintf を使うことを勧めます。

$[ への非 0 の代入は致命的エラーになります

この変数 (および対応する array_base 機能と arybase モジュール) は 配列と文字列の添え字操作の底を変更することができました。

これに非 0 の値を設定するのは Perl 5.12 から廃止予定になり、 Perl 5.30 から致命的エラーを投げます。

File::Glob::glob() は消滅します

File::Glob には glob という関数があり、 これは単に bsd_glob を呼び出します。 しかし、そのプロトタイプは CORE::glob と異なっているので、 File::Glob::glob は使うべきではありません。

File::Glob::glob() は Perl 5.8 で廃止予定になりました。 廃止予定メッセージは Perl 5.26 から出力されるようになり、 この関数は Perl 5.30 で消滅します。

File::Glob::glob() を使っているコードは代わりに File::Glob::bsd_glob() を呼び出すべきです。

正規表現中のエスケープされない左中かっこ(5.30 版)

前述の "Unescaped left braces in regular expressions" を 参照してください。

修飾されない dump()

CORE::dump() の代わりの dump() の使用は Perl 5.8 で廃止予定になり、 修飾されない dump() は Perl 5.30 で利用できなくなります。

"dump" in perlfunc を参照してください。

偽の条件で my() を使う

Perl には、宣言が偽の条件を含んでいる場合、スコープを出るときに レキシカル変数がクリアされないという長年のバグがあります。 一部の人々はある種の静的変数を達成するためにこのバグを悪用していました。 私たちがこのバグを修正できるように、人々はこの振る舞いに 依存しないべきです。

代わりに、同じ効果を達成するために state 変数を使うことを勧めます:

    use 5.10.0;
    sub count {state $counter; return ++ $counter}
    say count ();    # Prints 1
    say count ();    # Prints 2

state 変数は Perl 5.10 で導入されました。

あるいは、関数の外側の別のブロックの中で変数を宣言することで 似たような静的な効果を得られます:

    sub f { my $x if 0; return $x++ }

これは次のようになります:

    { my $x; sub f { return $x++ } }

偽の条件での my() の使用は Perl 5.10 で廃止予定になり、 Perl 5.30 で致命的エラーになりました。

:utf8 ハンドルに対するバイト読み書き

(明示的あるいは :encoding(UTF-16LE) 層のように暗黙的どちらでも) :utf8 層を持つハンドルに対する sysread(), recv(), syswrite(), send() 演算子は廃止予定です。

sysread() と recv() の両方は今のところ :utf8 フラグを ストリームのためだけに使い、実際の層は無視します。 sysread() と recv() は UTF-8 検証を行わないので、 不正にエンコードされたスカラを作ることになるかも知れません。

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

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

Perl 5.30 で、:utf8 ハンドルでバイトを読み書きするために sysread(), recv(), syswrite(), send() を使うことはできなくなります。

区切り文字として未割当符号位置や非独立書記素の使用

書記素は言語のネイティブスピーカーが文字であるために現れるものです。 Unicode (従って Perl) では、 書記素は実際には互いに完全な書記素を形成するいくつかの隣接する 文字かもしれません。 例えば、"R" のような基底文字と曲折アクセント "^" のような アクセントかもしれません; これは表示されるときには "R" の上に曲折アクセントがある単一の文字となります。

Perl 5.30 から、非独立書記素の区切り文字としての使用は致命的エラーです; これは複数文字書記素を区切り文字として受け入れられるように言語を 動かすためです。

また、Perl 5.30 から、いつか割り当てられるかも知れない 非割り当て符号位置の区切り文字も禁止されます。 さもなければ、もし現在割り当てられていない書記素が単体の書記素でないものに なった場合、今日動作しているコードがコンパイルに失敗することになります。 Unicode は決して 非文字符号位置正当な Unicode の最大値より大きな符号位置 を割り当てないので、 これらは区切り文字になることができます。

Perl 5.28

属性 :locked:unique

属性 (コードリファレンスに対する) :locked および (配列、ハッシュ、スカラリファレンスに対する) :unique は それぞれ Perl Perl 5.005 と Perl 5.8.8 から何もしなくなっていました。 これらの使用はその時から廃止予定でした。

Perl 5.28 から、これらの属性は文法エラーとなります。 これらの属性は何もしないので、コードからこれらを削除すれば 文法エラーを修正でき、削除することによってコードの振る舞いには 影響ありません。

空のヒヤドキュメント終端子

Perl は、最初の空行をヒヤドキュメントの末尾とするために空の ヒヤドキュメント終端子を使うことを許していました。 この監修は Perl 5.000 で廃止予定になりました; Perl 5.28 から、裸のヒヤドキュメント終端子の使用は 致命的エラーを投げます。

ヒヤドキュメントの終端子として空行を使いたい場合は、 明示的にクォートした形式を使うことが推奨されます:

  print <<"";
    Print this line.

  # Previous blank line ends the here-document.

$/ に非正整数へのリファレンスを設定

リファレンスが差しているのが非正整数のときにそのリファレンスを $/ に代入しました。 より古い Perl では、これは undef を設定するのと同じ ように見えます が、実際内部では異なり、 より効率が悪く、とても運が悪いとファイルがリファレンスの文字列化形式で 分割されることになります。

Perl 5.20.0 では、これは例外が投げられることを除けば、 正確に $/ に undef を設定するのと同じです。

Perl 5.28 から、$/ に非正整数へのリファレンスを設定すると 致命的エラーを投げます。

ファイルを吸い込みたい場合、明示的に $/undef を設定するように コードを変更することを薦めます。

Unicode 符号位置の値の制限

Unicode は 0x10FFFF までの符号位置だけを許していますが、 Perl はもっと大きなものも許しています。 Perl 5.28 まで、整数の最大値 (IV_MAX) を超える符号位置を許していました。 しかし、これは一部の構文でperl インタプリタを壊すことがあり、 一部の場合はハングアップを引き起こします。 問題があることが知られている分野は tr///、量指定子を使った正規表現パターンマッチング qX...X の中でのクォート区切り文字 (X は大きな符号位置の chr())、ループの上限でした。

範囲外の符号位置の使用は Perl 5.24 で廃止予定になりました; Perl 5.28 から、IV_MAX を超える符号位置の使用は致命的エラーを投げます。

あなたのコードを様々なプラットフォームで実行するためには、 上限はプラットフォームに依存することを覚えておいてください。 これは 64 ビットワードサイズでは 32 ビットのものより遙かに大きいです。 32 ビット整数では IV_MAX0x7FFFFFFF で、 64 ビット整数では IV_MAX0x7FFFFFFFFFFFFFFF です。

フォーマットでのカンマなしの変数リストの使用

フォーマットで、分割するカンマなしの変数のリストを使うことが 許されていました。 この使用法は長い間廃止予定で、Perl 5.28 からこれは致命的エラーを投げます。

\N{} の使用

中かっこの中に何もない \N{} の使用は Perl 5.24 で廃止予定になり、 Perl 5.28 から致命的エラーを投げます。

このような構文は空文字列を使うのと等価なので、 このような \N{} 構文を削除することを勧めます。

ファイルハンドルとディレクトリハンドルで同じシンボルを使う

ファイルハンドルとディレクトリハンドルに同じシンボル (グロブまたはスカラ) を代入するのに open() を使うのは、 以前は正当でした。 この慣用句は混乱を起こしやすく、Perl 5.10 で廃止予定になりました。

ファイルハンドルとディレクトリハンドルを open() するのに 同じシンボルを使うのは Perl 5.28 から致命的エラーを投げます。

代わりに二つの異なったシンボルを使うようにしてください。

${^ENCODING} はもはや対応しません

特殊変数 ${^ENCODING}encoding プラグマを実装するために 使われていました。 この変数を undef 以外の値に設定するのは Perl 5.22 で廃止予定になりました。 この変数の完全な廃止予定は Perl 5.25.3 で起こりました。

この変数に未定義値以外のものを設定するのは Perl 5.28 から致命的エラーを投げます。

B::OP::terse

単に B::Concise::b_terse を呼び出すこのメソッドは廃止予定で、 Perl 5.28 で消滅しました。 代わりに B::Concise を使ってください。

非メソッド %s() のための継承された AUTOLOAD はもはや許されません

ある (ゴホン) 偶発的な機能として、AUTOLOAD サブルーチンは、 たとえ autoload されるサブルーチンが (Foo->bar()$obj->bar() のように)メソッドとしてではなく (Foo::bar() のように)普通の関数として呼び出されても、 (@ISA 階層を使って) メソッドして検索されていました。

このバグは Perl 5.004 で廃止予定になり、 Perl 5.28 でメソッドの AUTOLOAD のみでメソッド検索するように 修正されました。

単純な規則は: 継承は非メソッドを autoload された時には動作しません。 古いコードのための簡単な修正方法は: BaseClass という名前のベースクラスから非メソッドの AUTOLOAD を継承することに依存しているそれぞれのモジュールで、 起動時に *AUTOLOAD = \&BaseClass::AUTOLOAD を実行します。

現在 use AutoLoader; @ISA = qw(AutoLoader); としているコードは、 @ISA から AutoLoader を削除して、 use AutoLoader;use AutoLoader 'AUTOLOAD'; に変更するべきです。

0xFF を超える符号位置に対する文字列ビット単位演算子の使用

文字列ビット単位演算子 &, |, ^, ~ は そのオペランドをバイト文字列として扱います。 従って、0xFF を超える値は意味がありません。 これらの演算子を使ったこのような符号位置の使用は Perl 5.24 で廃止予定になり、Perl 5.28 で致命的エラーになりました。

XS コード内での to_utf8_case() の使用

この関数は Perl 5.28 で削除されました; 代わりに以下のうち適切なものを呼び出すように変換してください: toFOLD_utf8_safe. toLOWER_utf8_safe, toTITLE_utf8_safe, toUPPER_utf8_safe.

Perl 5.26

Pod::Html での --libpods

Perl 5.18 から、--libpods は廃止予定で、 このオプションは警告を出力する以外に何もしていませんでした。

--libpods オプションは Perl 5.26 からはや認識しなくなりました。

ユーティリティ c2phpstruct

これらの古い、perl3 時代のユーティリティは、h2xs に置き換えられて 長い間廃止予定でした。 Perl 5.26 から、これらは削除されました。

プログラム終了中以外での $SIG {__DIE__} のトラップ

$SIG{__DIE__} フックは eval() の内側でも呼び出されます。 これが起きることは決して意図されていませんでしたが、 実装上の問題によりこれが可能になっていました。 これは廃止予定にされていました; なぜなら $@ の中の保留されている例外を書き換えるというような、 離れた場所でおかしな動作が可能になるからです。 これを修正する計画は却下されました; ユーザーが、保留している計画を書き換えるのは実際には有用な機能で バグではないと発見したからです。

Perl はこれに関する廃止予定警告を出したことはありません; 廃止予定は文書分署ポリシーによるものだけです。 しかし廃止予定は Perl 5.26 で実行されました。

"%s" での不正な UTF-8 文字列

このメッセージは、Perl コアまたは XS コードのバグを示しています。 このようなコードは、内部で UTF-8 でエンコードされて保管されたと されている文字が、句読点や数字のような特定の種類かどうかを 調べようとしています。 しかしこの文字は正当な UTF-8 でエンコードされていません。 %s は、知識のある人々がどのような種類をチェックしようとしたかを 決定するのに使われる文字列で置き換えられます。

不正な文字列を渡すのは Perl 5.18 で廃止予定になり、 Perl 5.26 で致命的エラーになりました。

Perl 5.24

*glob{FILEHANDLE} の使用

*glob{FILEHANDLE} の使用は Perl 5.8 で廃止予定になりました。 その意図は、*glob{FILEHANDLE} が別名である *glob{IO} を代わりに使うことでした。

しかし、この機能は Perl 5.24 で廃止予定でなくなりました。

POSIX::%s() の呼び出しは廃止予定です

POSIX モジュールの以下の関数はもはや利用できません: isalnum, isalpha, iscntrl, isdigit, isgraph, islower, isprint, ispunct, isspace, isupper, isxdigit。 これらの関数はバグっぽく、UTF-8 エンコードされた文字列で動作しません。 さらなる情報については POSIX のそれぞれの項目を参照してください。

これらの関数は Perl 5.20 で廃止予定になり、Perl 5.24 で削除されました。

Perl 5.16

* なしでのハンドルでの %s は廃止予定です

スカラが型グロブを保持しているときにスカラに対して tie, tied, untie を使うことが可能でした。 これはそのファイルハンドルが tie されていました。 型グロブを保持しているときにスカラ自身を tie したり、 型グロブが代入されているスカラを untie する方法はありませんでした。

これは Perl 5.14 で廃止予定になり、バグは Perl 5.16 で修正されました。

今では tie $scalar は保持しているハンドルではなく、常にスカラを tie します。 ハンドルを tie するためには、(明示的なアスタリスク付きの) tie *$scalar を使ってください。 同じことは tied *$scalaruntie *$scalar にも適用されます。

SEE ALSO

warnings, diagnostics.