NAME

perld595elta - perl v5.9.5 更新情報

説明

このドキュメントでは開発リリース 5.9.4 と 5.9.5 の間での変更点を 説明します. 5.8.0 から 5.9.4 までの変更点は perl590delta, perl591delta, perl592delta, perl593delta そして perl594delta を 参照してください.

互換性の無い変更点

汚染(taint)と printf

perl が taint モードで実行されているとき, printf() 及び sprintf() は汚染されている(tained)書式引数を 拒否するようになりました. (Rafael Garcia-Suarez)

undef とシグナルハンドラ

undef $SIG{FOO} によるシグナルハンドラのundef化 若しくは削除は 'DEFAULT' の設定と等価になりました. (Rafael)

defined() での構造体及び配列/ハッシュのデリファレンス

defined @$foo 及び defined %$barstrict 'refs' の影響に入るようになります(つまり, $foo 及び $bar は その場所において適切なリファレンスである必要があります).

(とはいっても, defined(@foo) 及び defined(%bar) は おすすめできない構文ですが.)

(?p{}) は削除されました

perl 5.8 で非推奨となっている正規表現構成子 (?p{}) は削除されました. (??{}) を使うようにしてください. (Rafael)

擬似ハッシュは削除されました

擬似ハッシュのサポートは Perl 5.9 から削除されました. (fields プラグマは残っていますが違う実装を使っています.)

バイトコードコンパイラ及び perlcc の削除

perlcc, バイトローダ及びそのサポートモジュール(B::C, B::CC, B::Bytecode, etc.)は perl ソースに同梱されなく なりました. これらの実験的なツールは確実な動作をせず, また perl 開発と連携して維持するボランティアもいないために 壊れたバージョンを入れておくのではなく削除されることに 決定しました. これらのモジュールの最新版は perl 5.9.4 に あります.

しかし B コンパイラフレームワークは他に役立つモジュール( 中でもとりわけ B::Deparse や B::Concise)のために perl コアでサポートは続けられます,

JPL の削除

JPL (Java-Perl Linguo) は perl ソース tar ボールから 削除されました.

再帰継承の早期検出

どこかのパッケージで @ISA を再帰継承となる形に変更すると その場で例外を発生させるようになりました.

これまではメソッドの解決や $foo->isa($bar) の ルックアップ等で再帰継承を使うまでは例外は発生され ませんでした.

コアの強化

正規表現

再帰するパターン

(??{}) 構成子を使わずに再帰するパターンを記述できる ようになりました. この新しい方式はより効率的で, また 多くの場合より読みやすくなります.

各キャプチャ括弧は (?PARNO) 構文を使って 利用できる独立したパターンとして扱われる ようになります(PARNOは "括弧番号(parenthesis number)"を 意味します). 例えば次のパターンはネストした 均等な角括弧にマッチします.

    /
     ^                      # start of line
     (                      # start capture buffer 1
        <                   #   match an opening angle bracket
        (?:                 #   match one of:
            (?>             #     don't backtrack over the inside of this group
                [^<>]+      #       one or more non angle brackets
            )               #     end non backtracking group
        |                   #     ... or ...
            (?1)            #     recurse to bracket 1 and try it again
        )*                  #   0 or more times.
        >                   #   match a closing angle bracket
     )                      # end capture buffer one
     $                      # end of line
    /x

    /
     ^                      # 行の始まり
     (                      # キャプチャバッファ1の始まり
        <                   #   開く角括弧のマッチ
        (?:                 #   次のいずれかにマッチ:
            (?>             #     このグループ内はバックトラックしない
                [^<>]+      #       1つ以上の各括弧以外の文字
            )               #     パックトラックしないグループの終わり
        |                   #     ... 若しくは ...
            (?1)            #     括弧 1 を再帰して再挑戦
        )*                  #   0 回若しくはそれ以上
        >                   #   閉じる角括弧
     )                      # キャプチャバッファ1の終わり
     $                      # 行の終わり
    /x

補足, PCRE を経験したことのあるユーザは PCRE での再帰は アトミック若しくは自然に"所有"されるのに対して, この Perl での 機能は再帰したパターンにバックトラックできる点で異なることに 気付くでしょう. (Yves Orton)

名前付きキャプチャバッファ

パターンに於いてキャプチャの括弧に名前をつけてキャプチャされた 内容を名前で参照することができるようになりました. 名前を付与する構文は (?<NAME>....) になります. また \k<NAME> 構文で名前をつけたバッファに 後方参照を行うこともできます. コードに於いて, 特殊なハッシュ %+ 及び %- を使って キャプチャされたバッファの内容にアクセスすることも できます.

従って, 次のようにして全ての2つ連続した文字を置換する ことができます.

    s/(?<letter>.)\k<letter>/$+{letter}/g

定義された内容を持っているバッファのみが %+ ハッシュで"可視"となります, つまり次のような ことができます:

    foreach my $name (keys %+) {
        print "content of buffer '$name' is $+{$name}\n";
    }

%- ハッシュにはもう少し完全なものが入っています, これには同じ名前の全てのキャプチャバッファの 値を保持する配列リファレンスを持っています.

%+ 及び %- は新しいモジュール Tie::Hash::NamedCapture を通して tie された ハッシュとして実装されています.

.NET の正規表現エンジンを使っているユーザは, perl の数値バッファの順序が "まず無名のもの, それから 名前付きのもの" ではなく, 順序よくなっているという 実装の違いに気付くでしょう. つまり次のパターンにおいて,

   /(A)(?<B>B)(C)(?<D>D)/

$1 は'A', $2 は 'B', $3 は 'C' そして $4 は 'D' となり, .NET プログラマの予期する $1 に 'A', $2 に 'C' 及び $3 に 'B' そして $4 に 'D' とはなりません. これは仕様です :-) (Yves Orton)

強欲な量指定子

"アトミックなマッチ"パターンで"強欲な量指定子"構文を サポートしました. 基本的に強欲は量指定子はできる限り 多くにマッチし後退させません. 従ってこれはバックトラックの 制御に利用できます. 構文は貪欲でない(non-greedy)マッチと 似ていますが, '?' の代わりに修飾子 '+' を使います. 従って ?+, *+, ++, {min,max}+ は正しい 量指定子になります. (Yves Orton)

バックトラック制御記号

正規表現エンジンはいくつかの特殊な用途のための バックトラック制御記号のサポートをするようになります: (*THEN), (*PRUNE), (*MARK), (*SKIP), (*COMMIT), (*FAIL) そして (*ACCEPT). これらの説明は perlre を参照 してください. (Yves Orton)

相対後方参照

新しい構文 \g{N} 及び \gN (ここで"N"は10進 整数)を使って相対的な後方参照の許可と同時に 安全な形式の後方参照記法が行えるようになります. これによって後方参照を含んだパターンの生成や埋め込みを より容易に行えるようになります. "Capture buffers" in perlre を参照してください. (Yves Orton)

\K エスケープ

Jeff Pinyan によるモジュール Regexp::Keep の 機能はコアに追加されました. これによって 可変長の正のルックビハインドのような用途に 利用できる特殊なエスケープ \K を 正規表現で利用できるようになりました. これは次のような置換に便利です:

  s/(foo)bar/$1/g

これは次のように置き換えることができます

  s/foo\Kbar//g

またこれはより効率的です. (Yves Orton)

垂直及び水平白空白, そして行区切り

正規表現に於いて \v 及び \h エスケープを認識 するようになりました, これらはそれぞれ垂直及び水平 白空白です. \V 及び \H はそれぞれの補集合に マッチします.

\R は汎用的な行区切りにマッチします, つまり, 垂直白空白, そして複数文字のシーケンス "\x0D\x0A".

_ プロトタイプ

新しいプロトタイプ文字が追加されました. _ がそれで, $ (スカラー)と等価ですが, 対応する引数が提供されなかったときに デフォルトとして $_ が使われます. 引数の省略方法からこれはプロトタイプの最後か, セミコロンの前でのみ使うことができます.

これの結果小さな非互換があります: prototype() 関数はいくつかの組み込み関数 に対して適切に _ を返すようになります( 例えば prototype('CORE::rmdir')). (Rafael)

UNITCHECK ブロック

BEGIN, CHECK, INIT 及び END に加えて 特殊コードブロック UNITCHECK が導入されました.

特殊な目的のために便利な CHECK 及び INIT ブロックはメインプログラムのコンパイルと 実行の間で常に実行され, つまりコードが 実行時にロードされる場合には使うことが できません. 一方, UNITCHECK ブロックはそれが 定義されている単位(unit)がコンパイルされた直後に 実行されます. より詳しい情報は perlmod を 参照してください. (Alex Gough)

readpipe() がオーバーライド可能に

組み込み関数 readpipe() がオーバーライド可能 になりました. これをオーバーライドすることに よって, これに対応する演算子, qx// (a.k.a. ``) もオーバーライドできます. さらに引数が渡されな かったときにはデフォルトで $_ が使われるように なりました. (Rafael)

readline() のデフォルトの引数

readline() は引数が渡されなかったときに デフォルトで *ARGV をとるようになりました. (Rafael)

UCD 5.0.0

Perl 5.9 に含まれる Unicode Character Database の コピーはバージョン 5.0.0 にアップデート されました.

スマートマッチ

スマートマッチ演算子 (~~) はデフォルトで 有効になりました (use feature で有効に する必要はなくなりました). (Michael G Schwern)

feature の暗黙なロード

最低限の perl バージョンを(use VERSION 構成子で) 5.9.5 以上に要求することで feature プラグマが暗黙に ロードされるようになりました.

モジュールとプラグマ

新しいプラグマ, mro

新しいプラグマ, mro (メソッド解決順序; Method Resolution Order)が追加されました. これを使うことで クラス毎に複数の継承階層を持っているときに継承 されたメソッドの探索に使うアルゴリズムを切り替える ことができます. デフォルトの MRO は変更されていません (DFS, 深さ優先探索; Depth First Search). 他に利用できるMROには C3 アルゴリズムがあります. 詳細は mro を参照してください. (Brandon Black)

クラス階層探索の実装の変更によって, *ISA グラブを undef にするようなコードでは恐らく 破損します. *ISA を undef にすることは @ISA 配列のマジックを削除する副作用を伴うため 第一に行うべきではありません.

bignum, bigint, bigrat

3つの数値プラグマ bignum, bigint そして bigrat はレキシカルスコープになりました. (Tels)

Math::BigInt/Math::BigFloat

多くのバグが修正されました; 注目すべきものは、NaN との比較で、 未定義値に関する警告を行わなくなりました。

新しいものは以下の通りです:

config()

config() メソッドは、config()->{'lib'} に加えて、 config('lib') という呼び出し形式にも対応しました。

import()

インポート時に、lib => 'Foo' を使ったときに、低レベルライブラリが 見つからないと警告するようになりました。 警告を抑制するためには、代わりに try => 'Foo' が使えます。 警告を die に変換するには、代わりに only => 'Foo' を使ってください。

roundmode common

common の丸めモードに対応しました。

また、以下のメソッドの対応も追加されました:

bpi(), bcos(), bsin(), batan(), batan2()
bmuladd()
bexp(), bnok()
from_hex(), from_oct(), and from_bin()
as_oct()

さらに、デフォルトの数学バックエンド (Calc (Perl) と FastCalc (XS)) は、 64 ビット整数か long double に対応している Perl では、7 桁ではなく 9 桁の数値の保管に対応しました。 これは、数値演算のスケールが向上し、従って、本当に大きな数値に対して より速くなることを意味します。

新しいコアモジュール

モジュールの変更

assertions

assertions プラグマ, そのサブクラスである assertions::activate 及び assertions::command そして -A コマンドラインスイッチは 削除されました. このインターフェースは安定リリースに 含めれるほど十分に成熟しているとは判断できませんでした.

base

base プラグマはクラスが自分自身を継承しようと したときに警告を発するようになりました. (Curtis "Ovid" Poe)

strict 及び warnings

strict 及び warnings は不適切な大文字小文字区別 (たとえば use Strict;)でロードされたときに 大声で騒ぐようになりました.

warnings

warnings プラグマは Carp をロードしなくなりました. この結果コンパイル時のロードなしに Carp ルーチンを 使っていたコードは修正する必要があるでしょう; 典型的には 次のような(間違った)コードは動かなくなるでしょう, そして関数名の後に 括弧を書く必要があるでしょう:

    use warnings;
    require Carp;
    Carp::confess "argh";
less

less は何か便利になりました(若しくは少なくともそうであろうと しています). 事実, これはレキシカルプラグマになりました. そしてモジュール側で, ユーザがより少ない CPU, 若しくは より少ないメモリ, より少ないマジック, 若しくはより少ない 脂っ気を要求しているかどうかをテストできます.

Attribute::Handlers

Attribute::Handlers は呼び出し元のファイル及び行番号を 報告できるようになりました. (David Feldman)

B::Lint

B::LintModule::Pluggable をベースとするようになりました, これによってプラグインで拡張することが出来ます. (Joshua ben Jore)

B

レキシカルなプラグマヒント(%^H)に B::COP::hints_hash() メソッドを 使ってアクセスできるようになりました. これは B::RHE オブジェクトを返し, B::RHE::HASH() メソッドを使ってハッシュリファレンスを得ることが できます. (Joshua ben Jore)

Thread

古い 5005thread スレッドモデルは削除されたので, ithreads スキームに 賛同して, Thread モジュールは古いコードで使うためだけの互換ラッパに なりました. これは動的エクステンションのデフォルトのリストから取り除かれました。

ユーティリティの変更点

cpanp

cpanp, CPANPLUS シェルが追加されました. (CPANPLUS 操作の ヘルパである cpanp-run-perl も追加されましたが, これは 直接使うためのものではありません).

cpan2dist

cpan2dist は CPANPLUS に同梱の新しいユーティリティです. これは CPAN モジュールから配布物(若しくはパッケージ)を 作るためのツールです.

pod2html

pod2html の出力は CSS を使ってカスタマイズできるように 強化されました. 幾つかの整形における問題点は修正されました. (Hari Aalto)

ドキュメント

新しいマニュアルページ, perlunifaq

新しいマニュアルページ, perlunifaq (Perl ユニコード FAQ)が 追加されました. (Juerd Waalboer)

パフォーマンス強化

インストールと Configure の向上

C++ compatibility

perl 及びコア XS モジュールを様々な C++ コンパイラ互換に するよう努力が行われました(けれどもテストされた幾つかの プラットフォームでの幾つかのコンパイラでは完全では ありませんでした).

Visual C++

Microsoft Visual C++ 2005 でコンパイルできるようになりました.

Win32 におけるstaticビルド

Win32 において perl59.dll に依存しない perl-static.exe をビルドできるようになりました. 詳細は Win32 Makefiles を参照してください. (Vadim Konovalov)

win32 ビルド

全ての win32 ビルド (MS-Win, WinCE) はマージされ、整理されました。

d_pseudofork and d_printf_format_null

d_pseudoforkd_printf_format_null)

Config モジュールで $Config{d_pseudofork} として提供 される新しいコンフィギュレーション変数が追加されました, これによって実際の fork() と Windows プラットフォームにおける 疑似 fork によるサポートを区別できます.

新しいコンフィギュレーション変数 d_printf_format_null が追加されました; printf 的なフォーマットで NULL が許されるかどうかを示します。

ヘルプ

Configure -h はもっとも有用なオプションに拡張されました。

'Whoa there' メッセージを大幅に減らしました。

64 ビットシステム

64 ビット(専用)システムの検出を向上させ、それに応じた(ライブラリ)パスを 全て設定するようになりました。

Ports

MidnightBSD での動作報告を得ました.

Cray XT4 Catamount/Qk への対応を追加しました。

RedHat と GenToo からのベンダーパッチをマージしました。

バグ修正抜粋

PerlIO::scalar は読み込み専用スカラーへの書き込みを 妨げるようになりました. さらに PerlIO::scalar ベースの ファイルハンドルで seek() がサポートされるようになりました, 元になる文字列は必要なだけゼロ埋めされます. (Rafael, Jarkko Hietaniemi)

study() は UTF-8 文字列では動作していませんでしたが, 間違った結果をもたらしていました. これは UTF-8 データ では何もしないようになります. (Yves Orton)

シグナル SIGILL, SIGBUS そして SIGSEGV は常に "unsafe" 方式で配送されるようになります(対して他の シグナルは perl インタプリタが安定した状態に達するまで 遅延されます; "Deferred Signals (Safe Signals)" in perlipc を参照してください). (Rafael)

新しいモジュール若しくはファイルが @INC フック経由で ロードされた時そしてこのフックが %INC にファイル名のエントリを 設定した時には __FILE__ は %INC エントリの内容に応じて 設定されます. (Rafael)

-w 及び -t スイッチは警告カテゴリがアクティブに されているかを散らかすこと無くつかえるようになりました. (Rafael)

:utf8 PerlIO レイヤ設定を持っているファイルハンドルの dup は dup されたファイルハンドルのレイヤから適切に 運ぶようになりました. (Rafael)

変数でキーを与えられたハッシュ要素の local 化は local() の 影響内で変数が変更される(local $h{$x};++$x等)と適切に動いて いませんでした. (Bo Lindbergh)

新しい及び変更された診断メッセージ

非推奨事項

2つの非推奨警告が追加されました: (Rafael)

    Opening dirhandle %s also as a file
    Opening filehandle %s also as a directory

    dirhandle %s を file としても開こうとしています
    filehandle %s を directory としても開こうとしています

変更された内部処理

無名ハッシュ及び配列の構築子は optree 内で 3 つの op ではなく 1つの op を取るようになりました, そして pp_anonhash 及び pp_anonlist は op が OPf_SPECIAL フラグを持つ時, ハッシュ /配列へのリファレンスを返します.

既知の問題

プラットホーム固有の問題

バグの報告方法

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

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

関連項目

Changes には完全な変更箇所があります.

INSTALL には Perl をビルドする方法があります.

README には一般的な事項があります.

Artistic 及び Copying には著作権情報があります.