perldeprecation - list Perl deprecations

perldeprecation - Perl の廃止予定の一覧


The purpose of this document is to document what has been deprecated in Perl, and by which version the deprecated feature will disappear, or, for already removed features, when it was removed.

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

This document will try to discuss what alternatives for the deprecated features are available.

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

The deprecated features will be grouped by the version of Perl in which they will be removed.

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


Unicode 区切り文字は組になります

Some unicode delimiters used to be allowed as single characters, but in the future will be part of a balanced pair. This deprecation category is used to mark the ones that will change from being unpaired to paired.

いくつかの Unicode 区切り文字は、単一の文字として認められていましたが、 将来バランスした組の一部になります。 この廃止予定カテゴリは、組ではないものから組になるものに変更されるものを マークするために使われます。

Category: "deprecated::delimiter_will_be_paired"

カテゴリ: "deprecated::delimiter_will_be_paired"

INC の中のドット

The current working directory . used to be automatically included in @INC, but in Perl 5.26 this was removed for security reasons. Ever since then we have produced a warning when a user uses do EXPR and EXPR does not include a path, and the file was not found in any directory in @INC but was located in .. The file will not be loaded but a deprecated warning will be generated.

現在の作業ディレクトリ . は自動的に @INC に含まれていましたが、 これはセキュリティ上の理由により Perl 5.26 で削除されました。 それ以降、パスが含まれていない do EXPR and EXPR を使っていて、 ファイルが @INC のディレクトリになく、. にある場合に、 警告が出力されています。 ファイルは読み込まれませんが廃止予定警告が生成されます。

Category: "deprecated::dot_in_inc"

カテゴリ: "deprecated::dot_in_inc"

Unicode 特性名

Various types of unicode property name will generate deprecated warnings when used in a regex pattern. For instance surrogate characters will result in deprecation warnings.

様々な種類の Unicode 特性名は、正規表現パターン内で使われると 廃止予定警告が生成されます。 例えば、代用文字は廃止予定警告が出ます。

Category: "deprecated::unicode_property_name"

カテゴリ: "deprecated::unicode_property_name"

Perl 5.44

Calling a missing import() or unimport() method with an argument

(引数付きでの存在しない import()unimport() メソッドの呼び出し)

Historically calling import() or unimport() on any class which did not define such a method would be silently ignored. Effectively Perl behaved as though there was an empty method defined in the UNIVERSAL package (even when there was no such method actually defined). As of Perl version 5.39.2 calling such a method with an argument will trigger a warning, and in Perl version 5.44 this warning will be upgraded to an error. (Calling such a method with no arguments at all will always be safe.)

歴史的には、そのようなメソッドを定義していないクラスで import() または unimport() を呼び出すと、黙って無視されていました。 事実上、Perl は UNIVERSAL パッケージに空のメソッドが 定義されているかのように動作しました (そのようなメソッドが実際に定義されていない場合でも)。 Perl バージョン 5.39.2 では、引数付きで そのようなメソッドを呼び出すと、 警告が発生します; Perl バージョン 5.44 では、この警告はエラーに昇格します。 (そのようなメソッドを引数なしで呼び出すことは常に安全です。)

Category: "deprecated::missing_import_called_with_args"

Changing use VERSION while another use VERSION is in scope

(スコープ内に別の use VERSION がすでに存在している状態での use VERSION の変更)

A use VERSION declaration has many implicit effects on the surrounding scope, such as strict and feature flags, or importing builtin functions. Once you have a use VERSION statement in scope, another use VERSION statement with a different version is now deprecated since Perl 5.39.8, due to the increasing complexity of swapping from one prevailing version to another.

use VERSION 宣言は、strict フラグや feature フラグ、builtin 関数の インポートなど、周囲のスコープに対して多くの暗黙的な影響を与えます。 Perl 5.39.8 以降、一旦スコープ内に use VERSION 文があると、別のバージョンを 持つもう一つの use VERSION 文は廃止予定になりました; これは、ある一般的なバージョンから別のバージョンへの交換が 複雑になったためです。

Category: "deprecated::subsequent_use_version"

Perl 5.42


Smartmatch is now seen as a failed experiment and was marked as deprecated in Perl 5.37.10. This includes the when and given keywords, as well as the smartmatch operator ~~. The feature will be removed entirely in the Perl 5.42.0 production release.

スマートマッチングは失敗した実験として見られていて、 Perl 5.37.10 で廃止予定としてマークされました。 これは、whengiven キーワードおよび、 スマートマッチング演算子 ~~ を含みます。 この機能は、Perl 5.42.0 製品版リリースで完全に削除されます。

Category: "deprecated::smartmatch"

カテゴリ: "deprecated::smartmatch"

goto ブロック構文

goto LABEL; will produce a deprecated warning when jumping into the body of a loop or other block construct from outside. For instance

goto LABEL; は、ループの本体や他のブロックの外側から内側に ジャンプしようとすると、廃止予定警告が出力されます。 例えば:

    while (should_loop($x)) {
    goto LABEL;

will produce a warning that this behavior is deprecated. In general you should just avoid doing this; the people that maintain your code will be grateful for your restraint.

この振る舞いは廃止予定なので警告が出力されます。 一般的に、こうすることは単に避けるべきです; あなたのコードを保守する人々は、あなたの節制に感謝するでしょう。

Category: "deprecated::goto_construct"

カテゴリ: "deprecated::goto_construct"

Use of ' as a global name separator

(グローバルな名前区切り文字としての ' の使用)

Perl allows use of ' instead of :: to replace the parts of a package or global variable name, for example A::B and A'B are equivalent.

Perl では、パッケージやグローバル変数の名前の部分を置き換えるために :: の代わりに ' を使えます; 例えば A::BA'B は等価です。

' will no longer be recognized as a name separator in Perl 5.42.

Perl 5.42 から、' はもはや名前区切り文字として認識されません。

Category: "deprecated::apostrophe_as_package_separator"

カテゴリ: "deprecated::apostrophe_as_package_separator"

Perl 5.40

Downgrading a use VERSION to below v5.11

(use VERSION の v5.11 より以前への降格)

Once Perl has seen a use VERSION declaration that requests a version v5.11 or above, a subsequent second declaration that requests an earlier version will print a deprecation warning. For example,

一度 Perl が v5.11 以降を要求する use VERSION 宣言を見ると、 引き続いてより前のバージョンを要求する 2 番目の宣言があったときに、 廃止予定警告を表示します。 例えば:

    use v5.14;
    say "We can use v5.14's features here";

    use v5.10;        # This prints a warning

This was deprecated in Perl 5.36 and is now fatal.

これは Perl 5.36 で廃止予定になり、今回致命的エラーになりました。

This is because of an intended related change to the interaction between use VERSION and use strict. If you specify a version >= 5.11, strict is enabled implicitly. If you request a version < 5.11, strict will become disabled even if you had previously written use strict. This was not the previous behaviour of use VERSION, which at present will track explicitly-enabled strictness flags independently.

これは、use VERSIONuse strict の相互作用に関する意図した 変更のためです。 バージョンに >= 5.11 を指定すると、strict が暗黙に有効になります。 バージョンに < 5.11 を要求すると、 use strict がたとえその前に書かれていても 無効になります。 これは use VERSION の以前の振る舞いと異なります; 現在の所 明示的に有効にされた strict フラグは独立に追跡しています。

Category: "deprecated::version_downgrade"

カテゴリ: "deprecated::version_downgrade"

Perl 5.38

Pod::Html ユーティリティ関数

The definition and documentation of three utility functions previously importable from Pod::Html were moved to new package Pod::Html::Util in Perl 5.36. While they remained importable from Pod::Html in Perl 5.36, as of Perl 5.38 they are only importable, on request, from Pod::Html::Util.

以前は Pod::Html からインポート可能だった三つのユーティリティ関数の 定義と文書は、Perl 5.36 から新しいパッケージ Pod::Html::Util に 移動しました。 Perl 5.36 ではまだ Pod::Html からインポート可能ですが、 Perl 5.38 から、Pod::Html::Util からのみ要求に応じてインポート可能です。

Perl 5.34

There were no deprecations or fatalizations in Perl 5.34.

Perl 5.34 での廃止予定や致命的エラー化はありませんでした。

Perl 5.32


You wrote something like


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

but $var is referenced elsewhere and could be modified after the sub expression is evaluated. Either it is explicitly modified elsewhere ($var = 3) or it is passed to a subroutine or to an operator like printf or map, which may or may not modify the variable.

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

Traditionally, Perl has captured the value of the variable at that point and turned the subroutine into a constant eligible for inlining. In those cases where the variable can be modified elsewhere, this breaks the behavior of closures, in which the subroutine captures the variable itself, rather than its value, so future changes to the variable are reflected in the subroutine's return value.

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

If you intended for the subroutine to be eligible for inlining, then make sure the variable is not referenced elsewhere, possibly by copying it:

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

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

If you do want this subroutine to be a closure that reflects future changes to the variable that it closes over, add an explicit return:

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

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

This usage was deprecated and as of Perl 5.32 is no longer allowed.

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

Use of strings with code points over 0xFF as arguments to vec

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

vec views its string argument as a sequence of bits. A string containing a code point over 0xFF is nonsensical. This usage is deprecated in Perl 5.28, and was removed in Perl 5.32.

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

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

The string bitwise operators, &, |, ^, and ~, treat their operands as strings of bytes. As such, values above 0xFF are nonsensical. Some instances of these have been deprecated since Perl 5.24, and were made fatal in 5.28, but it turns out that in cases where the wide characters did not affect the end result, no deprecation notice was raised, and so remain legal. Now, all occurrences either are fatal or raise a deprecation warning, so that the remaining legal occurrences became fatal in 5.32.

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

An example of this is


 "" & "\x{100}"

The wide character is not used in the & operation because the left operand is shorter. This now throws an exception.

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

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

The function hostname() in the Sys::Hostname module has always been documented to be called with no arguments. Historically it has not enforced this, and has actually accepted and ignored any arguments. As a result, some users have got the mistaken impression that an argument does something useful. To avoid these bugs, the function is being made strict. Passing arguments was deprecated in Perl 5.28 and became fatal in Perl 5.32.

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


The simple rule to remember, if you want to match a literal { character (U+007B LEFT CURLY BRACKET) in a regular expression pattern, is to escape each literal instance of it in some way. Generally easiest is to precede it with a backslash, like \{ or enclose it in square brackets ([{]). If the pattern delimiters are also braces, any matching right brace (}) should also be escaped to avoid confusing the parser, for example,

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


Forcing literal { characters to be escaped will enable the Perl language to be extended in various ways in future releases. To avoid needlessly breaking existing code, the restriction is not enforced in contexts where there are unlikely to ever be extensions that could conflict with the use of { as a literal. A non-deprecation warning that the left brace is being taken literally is raised in contexts where there could be confusion about it.

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

Literal uses of { were deprecated in Perl 5.20, and some uses of it started to give deprecation warnings since. These cases were made fatal in Perl 5.26. Due to an oversight, not all cases of a use of a literal { got a deprecation warning. Some cases started warning in Perl 5.26, and were made fatal in Perl 5.30. Other cases started in Perl 5.28, and were made fatal in 5.32.

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

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

The macros below now require an extra parameter compared to versions prior to Perl 5.32. The final parameter in each one is a pointer into the string supplied by the first parameter beyond which the input will not be read. This prevents potential reading beyond the end of the buffer. 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, and toUPPER_utf8.

これらのマクロは 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.

Since Perl 5.26, this functionality with the extra parameter has been available by using a corresponding macro to each one of these, and whose name is formed by appending _safe to the base name. There is no change to the functionality of those. For example, isDIGIT_utf8_safe corresponds to isDIGIT_utf8, and both now behave identically. All are documented in "Character case changing" in perlapi and "Character classification" in perlapi.

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

This change was originally scheduled for 5.30, but was delayed until 5.32.

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

File::Glob::glob() was removed

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

File::Glob had a function called glob, which just called bsd_glob.

File::Glob には glob という関数があり、 これは単に bsd_glob を呼び出していました。

File::Glob::glob() was deprecated in Perl 5.8. A deprecation message was issued from Perl 5.26 onwards, the function became fatal in Perl 5.30, and was removed entirely in Perl 5.32.

File::Glob::glob() は Perl 5.8 で廃止予定になりました。 廃止予定メッセージは Perl 5.26 から出力されていて、 この関数は Perl 5.30 で致命的エラーになり、 Perl 5.32 で完全に取り除かれました。

Code using File::Glob::glob() should call File::Glob::bsd_glob() instead.

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

Perl 5.30

$* is no longer supported

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

Before Perl 5.10, setting $* to a true value globally enabled multi-line matching within a string. This relic from the past lost its special meaning in 5.10. Use of this variable became a fatal error in Perl 5.30, freeing the variable up for a future special meaning.

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

To enable multiline matching one should use the /m regexp modifier (possibly in combination with /s). This can be set on a per match basis, or can be enabled per lexical scope (including a whole file) with use re '/m'.

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

$# is no longer supported

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

This variable used to have a special meaning -- it could be used to control how numbers were formatted when printed. This seldom used functionality was removed in Perl 5.10. In order to free up the variable for a future special meaning, its use became a fatal error in Perl 5.30.

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

To specify how numbers are formatted when printed, one is advised to use printf or sprintf instead.

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

Assigning non-zero to $[ is fatal

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

This variable (and the corresponding array_base feature and arybase module) allowed changing the base for array and string indexing operations.

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

Setting this to a non-zero value has been deprecated since Perl 5.12 and throws a fatal error as of Perl 5.30.

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

Unqualified dump()

(修飾されない dump())

Use of dump() instead of CORE::dump() was deprecated in Perl 5.8, and an unqualified dump() is no longer available as of Perl 5.30.

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

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

偽の条件で my() を使う

There has been a long-standing bug in Perl that causes a lexical variable not to be cleared at scope exit when its declaration includes a false conditional. Some people have exploited this bug to achieve a kind of static variable. To allow us to fix this bug, people should not be relying on this behavior.

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

Instead, it's recommended one uses state variables to achieve the same effect:

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

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

state variables were introduced in Perl 5.10.

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

Alternatively, you can achieve a similar static effect by declaring the variable in a separate block outside the function, e.g.,

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

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



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

The use of my() in a false conditional has been deprecated in Perl 5.10, and became a fatal error in Perl 5.30.

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

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

The sysread(), recv(), syswrite() and send() operators are deprecated on handles that have the :utf8 layer, either explicitly, or implicitly, eg., with the :encoding(UTF-16LE) layer.

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

Both sysread() and recv() currently use only the :utf8 flag for the stream, ignoring the actual layers. Since sysread() and recv() do no UTF-8 validation they can end up creating invalidly encoded scalars.

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

Similarly, syswrite() and send() use only the :utf8 flag, otherwise ignoring any layers. If the flag is set, both write the value UTF-8 encoded, even if the layer is some different encoding, such as the UTF-16LE example above.

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

Ideally, all of these operators would completely ignore the :utf8 state, working only with bytes, but this would result in silently breaking existing code. To avoid this a future version of perl will throw an exception when any of sysread(), recv(), syswrite() or send() are called on handles with the :utf8 layer.

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

As of Perl 5.30, it is no longer possible to use sysread(), recv(), syswrite() or send() to read or send bytes from/to :utf8 handles.

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


A grapheme is what appears to a native speaker of a language to be a character. In Unicode (and hence Perl) a grapheme may actually be several adjacent characters that together form a complete grapheme. For example, there can be a base character, like "R" and an accent, like a circumflex "^", that appear to be a single character when displayed, with the circumflex hovering over the "R".

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

As of Perl 5.30, use of delimiters which are non-standalone graphemes is fatal, in order to move the language to be able to accept multi-character graphemes as delimiters.

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

Also, as of Perl 5.30, delimiters which are unassigned code points but that may someday become assigned are prohibited. Otherwise, code that works today would fail to compile if the currently unassigned delimiter ends up being something that isn't a stand-alone grapheme. Because Unicode is never going to assign non-character code points, nor code points that are above the legal Unicode maximum, those can be delimiters.

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

Perl 5.28

Attributes :locked and :unique

(属性 :locked:unique)

The attributes :locked (on code references) and :unique (on array, hash and scalar references) have had no effect since Perl 5.005 and Perl 5.8.8 respectively. Their use has been deprecated since.

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

As of Perl 5.28, these attributes are syntax errors. Since the attributes do not do anything, removing them from your code fixes the syntax error; and removing them will not influence the behaviour of your code.

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


Perl has allowed you to use a bare here-document terminator << to have the here-document end at the first empty line. This practise was deprecated in Perl 5.000; as of Perl 5.28, using a bare here-document terminator throws a fatal error.

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

You are encouraged to use the explicitly quoted form if you wish to use an empty line as the terminator of the here-document:

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

  print <<"";
    Print this line.

  # Previous blank line ends the here-document.

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

You assigned a reference to a scalar to $/ where the referenced item is not a positive integer. In older perls this appeared to work the same as setting it to undef but was in fact internally different, less efficient and with very bad luck could have resulted in your file being split by a stringified form of the reference.

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

In Perl 5.20.0 this was changed so that it would be exactly the same as setting $/ to undef, with the exception that this warning would be thrown.

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

As of Perl 5.28, setting $/ to a reference to a non-positive integer throws a fatal error.

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

You are recommended to change your code to set $/ to undef explicitly if you wish to slurp the file.

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

Unicode 符号位置の値の制限

Unicode only allows code points up to 0x10FFFF, but Perl allows much larger ones. Up till Perl 5.28, it was allowed to use code points exceeding the maximum value of an integer (IV_MAX). However, that did break the perl interpreter in some constructs, including causing it to hang in a few cases. The known problem areas were in tr///, regular expression pattern matching using quantifiers, as quote delimiters in qX...X (where X is the chr() of a large code point), and as the upper limits in loops.

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

The use of out of range code points was deprecated in Perl 5.24; as of Perl 5.28 using a code point exceeding IV_MAX throws a fatal error.

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

If your code is to run on various platforms, keep in mind that the upper limit depends on the platform. It is much larger on 64-bit word sizes than 32-bit ones. For 32-bit integers, IV_MAX equals 0x7FFFFFFF; for 64-bit integers, IV_MAX equals 0x7FFFFFFFFFFFFFFF.

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


It was allowed to use a list of variables in a format, without separating them with commas. This usage has been deprecated for a long time, and as of Perl 5.28, this throws a fatal error.

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

Use of \N{}

(\N{} の使用)

Use of \N{} with nothing between the braces was deprecated in Perl 5.24, and throws a fatal error as of Perl 5.28.

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

Since such a construct is equivalent to using an empty string, you are recommended to remove such \N{} constructs.

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


It used to be legal to use open() to associate both a filehandle and a dirhandle to the same symbol (glob or scalar). This idiom is likely to be confusing, and it was deprecated in Perl 5.10.

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

Using the same symbol to open() a filehandle and a dirhandle throws a fatal error as of Perl 5.28.

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

You should be using two different symbols instead.


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

The special variable ${^ENCODING} was used to implement the encoding pragma. Setting this variable to anything other than undef was deprecated in Perl 5.22. Full deprecation of the variable happened in Perl 5.25.3.

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

Setting this variable to anything other than an undefined value throws a fatal error as of Perl 5.28.

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


This method, which just calls B::Concise::b_terse, has been deprecated, and disappeared in Perl 5.28. Please use B::Concise instead.

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

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

As an (ahem) accidental feature, AUTOLOAD subroutines were looked up as methods (using the @ISA hierarchy) even when the subroutines to be autoloaded were called as plain functions (e.g. Foo::bar()), not as methods (e.g. Foo->bar() or $obj->bar()).

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

This bug was deprecated in Perl 5.004 and has been rectified in Perl 5.28 by using method lookup only for methods' AUTOLOADs.

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

The simple rule is: Inheritance will not work when autoloading non-methods. The simple fix for old code is: In any module that used to depend on inheriting AUTOLOAD for non-methods from a base class named BaseClass, execute *AUTOLOAD = \&BaseClass::AUTOLOAD during startup.

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

In code that currently says use AutoLoader; @ISA = qw(AutoLoader); you should remove AutoLoader from @ISA and change use AutoLoader; to use AutoLoader 'AUTOLOAD';.

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

In XS code, use of to_utf8_case()

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

This function has been removed as of Perl 5.28; instead convert to call the appropriate one of: toFOLD_utf8_safe. toLOWER_utf8_safe, toTITLE_utf8_safe, or toUPPER_utf8_safe.

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

Perl 5.26

--libpods in Pod::Html

(Pod::Html での --libpods)

Since Perl 5.18, the option --libpods has been deprecated, and using this option did not do anything other than producing a warning.

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

The --libpods option is no longer recognized as of Perl 5.26.

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

The utilities c2ph and pstruct

(ユーティリティ c2phpstruct)

These old, perl3-era utilities have been deprecated in favour of h2xs for a long time. As of Perl 5.26, they have been removed.

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

Trapping $SIG{__DIE__} other than during program exit

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

The $SIG{__DIE__} hook is called even inside an eval(). It was never intended to happen this way, but an implementation glitch made this possible. This used to be deprecated, as it allowed strange action at a distance like rewriting a pending exception in $@. Plans to rectify this have been scrapped, as users found that rewriting a pending exception is actually a useful feature, and not a bug.

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

Perl never issued a deprecation warning for this; the deprecation was by documentation policy only. But this deprecation has been lifted as of Perl 5.26.

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

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

This message indicates a bug either in the Perl core or in XS code. Such code was trying to find out if a character, allegedly stored internally encoded as UTF-8, was of a given type, such as being punctuation or a digit. But the character was not encoded in legal UTF-8. The %s is replaced by a string that can be used by knowledgeable people to determine what the type being checked against was.

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

Passing malformed strings was deprecated in Perl 5.18, and became fatal in Perl 5.26.

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

Perl 5.24

Use of *glob{FILEHANDLE}

(*glob{FILEHANDLE} の使用)

The use of *glob{FILEHANDLE} was deprecated in Perl 5.8. The intention was to use *glob{IO} instead, for which *glob{FILEHANDLE} is an alias.

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

However, this feature was undeprecated in Perl 5.24.

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

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

The following functions in the POSIX module are no longer available: isalnum, isalpha, iscntrl, isdigit, isgraph, islower, isprint, ispunct, isspace, isupper, and isxdigit. The functions are buggy and don't work on UTF-8 encoded strings. See their entries in POSIX for more information.

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

The functions were deprecated in Perl 5.20, and removed in Perl 5.24.

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

Perl 5.16

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

It used to be possible to use tie, tied or untie on a scalar while the scalar holds a typeglob. This caused its filehandle to be tied. It left no way to tie the scalar itself when it held a typeglob, and no way to untie a scalar that had had a typeglob assigned to it.

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

This was deprecated in Perl 5.14, and the bug was fixed in Perl 5.16.

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

So now tie $scalar will always tie the scalar, not the handle it holds. To tie the handle, use tie *$scalar (with an explicit asterisk). The same applies to tied *$scalar and untie *$scalar.

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


warnings, diagnostics.