perldelta - perl v5.9.5 更新情報
このドキュメントでは開発リリース 5.9.4 と 5.9.5 の間での変更点を 説明します. 5.8.0 から 5.9.4 までの変更点は perl590delta, perl591delta, perl592delta, perl593delta そして perl594delta を 参照してください.
perl が taint モードで実行されているとき, printf()
及び sprintf() は汚染されている(tained)書式引数を
拒否するようになりました. (Rafael Garcia-Suarez)
undef $SIG{FOO} によるシグナルハンドラのundef化
若しくは削除は 'DEFAULT' の設定と等価になりました. (Rafael)
defined @$foo 及び defined %$bar は strict 'refs'
の影響に入るようになります(つまり, $foo 及び $bar は
その場所において適切なリファレンスである必要があります).
(とはいっても, defined(@foo) 及び defined(%bar) は
おすすめできない構文ですが.)
(?p{}) は削除されましたperl 5.8 で非推奨となっている正規表現構成子 (?p{})
は削除されました. (??{}) を使うようにしてください. (Rafael)
擬似ハッシュのサポートは Perl 5.9 から削除されました.
(fields プラグマは残っていますが違う実装を使っています.)
perlcc, バイトローダ及びそのサポートモジュール(B::C,
B::CC, B::Bytecode, etc.)は perl ソースに同梱されなく
なりました. これらの実験的なツールは確実な動作をせず,
また perl 開発と連携して維持するボランティアもいないために
壊れたバージョンを入れておくのではなく削除されることに
決定しました. これらのモジュールの最新版は perl 5.9.4 に
あります.
しかし B コンパイラフレームワークは他に役立つモジュール( 中でもとりわけ B::Deparse や B::Concise)のために perl コアでサポートは続けられます,
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進
整数)を使って相対的な後方参照の許可と同時に
安全な形式の後方参照記法が行えるようになります.
これによって後方参照を含んだパターンの生成や埋め込みを
より容易に行えるようになります. perlre/Capture buffers
を参照してください. (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)
BEGIN, CHECK, INIT 及び END に加えて
特殊コードブロック UNITCHECK が導入されました.
特殊な目的のために便利な CHECK 及び INIT
ブロックはメインプログラムのコンパイルと
実行の間で常に実行され, つまりコードが
実行時にロードされる場合には使うことが
できません. 一方, UNITCHECK ブロックはそれが
定義されている単位(unit)がコンパイルされた直後に
実行されます. より詳しい情報は perlmod を
参照してください. (Alex Gough)
組み込み関数 readpipe() がオーバーライド可能
になりました. これをオーバーライドすることに
よって, これに対応する演算子, qx// (a.k.a. ``)
もオーバーライドできます. さらに引数が渡されな
かったときにはデフォルトで $_ が使われるように
なりました. (Rafael)
readline() は引数が渡されなかったときに
デフォルトで *ARGV をとるようになりました.
(Rafael)
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
配列のマジックを削除する副作用を伴うため
第一に行うべきではありません.
3つの数値プラグマ bignum, bigint そして
bigrat はレキシカルスコープになりました. (Tels)
多くのバグが修正されました; 注目すべきものは、NaN との比較で、 未定義値に関する警告を行わなくなりました。
新しいものは以下の通りです:
config() メソッドは、config()->{'lib'} に加えて、
config('lib') という呼び出し形式にも対応しました。
インポート時に、lib => 'Foo' を使ったときに、低レベルライブラリが
見つからないと警告するようになりました。
警告を抑制するためには、代わりに try => 'Foo' が使えます。
警告を die に変換するには、代わりに only => 'Foo' を使ってください。
common の丸めモードに対応しました。
また、以下のメソッドの対応も追加されました:
さらに、デフォルトの数学バックエンド (Calc (Perl) と FastCalc (XS)) は、 64 ビット整数か long double に対応している Perl では、7 桁ではなく 9 桁の数値の保管に対応しました。 これは、数値演算のスケールが向上し、従って、本当に大きな数値に対して より速くなることを意味します。
Locale::Maketext::Simple,
CPANPLUS に必要な Locale::Maketext::Lexicon の
簡単なラッパー. Locale::Maketext::Lexicon は
perl コアには含まれていない点に注意してください;
Locale::Maketext::Simple の振る舞いは Lexicon が
存在しなかったときには大きくデグレードされています.
Params::Check, 汎用的な入力パース/チェックメカニズムの
実装. CPANPLUS で使われます.
Term::UI, ターミナルプロンプトでの
応答タスクを用意にします.
Object::Accessor, オブジェクト毎の
アクセサインターフェースを提供します.
Module::Pluggable, プラガブルなサブモジュール
を受け付けるモジュールを作るための簡単な
フレームワークです.
Module::Load::Conditional, インストールされて
いるモジュールの問い合わせ及びロードを簡単に
提供します.
Time::Piece は組み込みの localtime() および
gmtime() をオーバーライドして時刻関数の
オブジェクト指向なインターフェースを提供します.
IPC::Cmd, 外部コマンドの探索及び実行を
インタラクティブに助けます.
File::Fetch, ファイルのフェッチメカニズムを
簡単で汎用的に提供します.
Log::Message 及び Log::Message::Simple,
CPANPLUS のログ機能に使われています.
Archive::Extract, .tar (plain, gzip, bzip)
若しくは .zip ファイルの汎用的な
アーカイブ展開メカニズム.
CPANPLUS, CPAN ミラーへアクセスする API 及び
コマンドラインツールを提供.
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::Lint は Module::Pluggable をベースとするようになりました,
これによってプラグインで拡張することが出来ます. (Joshua ben Jore)
B
レキシカルなプラグマヒント(%^H)に B::COP::hints_hash() メソッドを
使ってアクセスできるようになりました. これは B::RHE オブジェクトを返し,
B::RHE::HASH() メソッドを使ってハッシュリファレンスを得ることが
できます. (Joshua ben Jore)
Thread
古い 5005thread スレッドモデルは削除されたので, ithreads スキームに
賛同して, Thread モジュールは古いコードで使うためだけの互換ラッパに
なりました.
これは動的エクステンションのデフォルトのリストから取り除かれました。
cpanpcpanp, CPANPLUS シェルが追加されました. (CPANPLUS 操作の
ヘルパである cpanp-run-perl も追加されましたが, これは
直接使うためのものではありません).
cpan2distcpan2dist は CPANPLUS に同梱の新しいユーティリティです.
これは CPAN モジュールから配布物(若しくはパッケージ)を
作るためのツールです.
pod2htmlpod2html の出力は CSS を使ってカスタマイズできるように
強化されました. 幾つかの整形における問題点は修正されました.
(Hari Aalto)
新しいマニュアルページ, perlunifaq (Perl ユニコード FAQ)が 追加されました. (Juerd Waalboer)
perl 及びコア XS モジュールを様々な C++ コンパイラ互換に するよう努力が行われました(けれどもテストされた幾つかの プラットフォームでの幾つかのコンパイラでは完全では ありませんでした).
Microsoft Visual C++ 2005 でコンパイルできるようになりました.
Win32 において perl59.dll に依存しない
perl-static.exe をビルドできるようになりました.
詳細は Win32 Makefiles を参照してください. (Vadim Konovalov)
(win32 ビルド)
全ての win32 ビルド (MS-Win, WinCE) はマージされ、整理されました。
d_pseudofork and d_printf_format_nulld_pseudofork と d_printf_format_null)
Config モジュールで $Config{d_pseudofork} として提供
される新しいコンフィギュレーション変数が追加されました,
これによって実際の fork() と Windows プラットフォームにおける
疑似 fork によるサポートを区別できます.
新しいコンフィギュレーション変数 d_printf_format_null が追加されました;
printf 的なフォーマットで NULL が許されるかどうかを示します。
(ヘルプ)
Configure -h はもっとも有用なオプションに拡張されました。
'Whoa there' メッセージを大幅に減らしました。
(64 ビットシステム)
64 ビット(専用)システムの検出を向上させ、それに応じた(ライブラリ)パスを 全て設定するようになりました。
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 インタプリタが安定した状態に達するまで 遅延されます; perlipc/Deferred Signals (Safe Signals) を参照してください). (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 には著作権情報があります.