=head1 名前 perldelta - perl v5.8.1 での変更点 =head1 説明 このドキュメントでは 5.8.0 リリースと 5.8.1 リリースの変更点を 記述しています. もしそれよりも前のリリース, 例えば 5.6.1 等からアップデートするのなら, 5.6.0 と 5.8.0 との違いが書かれている L を読んでおいた方が よいでしょう. 5.6.1 は驚くものではありません. これは開発リリースの 5.7.1 とは異なり バグ修正版です. 混乱しますか? 時間のグラフで説明するとわかりやすい かもしれません: ここにあげるのは新しいメジャーリリース及び メンテナンスリリース, 開発リリースです. New Maintenance Development 5.6.0 2000-Mar-22 5.7.0 2000-Sep-02 5.6.1 2001-Apr-08 5.7.1 2001-Apr-09 5.7.2 2001-Jul-13 5.7.3 2002-Mar-05 5.8.0 2002-Jul-18 5.8.1 2003-Sep-25 =head1 非互換となる変更点 =head2 ハッシュのランダム化 主にセキュリティ上の理由から, ハッシュの"ランダム順序"がよりランダムに なりました. これまでは keys(), values(), each() から得られるハッシュ要素の 順序はランダムではありましたが, 繰り返しても安定でした. しかし今後は この順序は Perl の実行毎に変化します. B. そしてその順序は Perl 5 においても数回変化しています. また, ハッシュキーの順序も挿入の順番によって常に変化していますし, 変化していくでしょう. 新しいランダム性はアプリケーションに影響を与えるでしょう. 考えられるシナリオとしてはハッシュデータを含むアプリケーションからの出力 です. たとえばデータを Data::Dumper を用いて異なるファイルに出力し, そのファイルを比較してデータの変化を調べていたのなら, ダンプされたハッシュの 順序は様々であるため同一と判断されることはないでしょう. 一般的な回避策としてはキー(もしくは値で)ソートすることです. Data::Dumper においては C オプションを使えるでしょう. 特定の順序が本当に重要であるならタイされたハッシュを使うべきでしょう. 例えば Tie::IxHash モジュールはハッシュ要素が追加された順番を保存します. より微妙な問題は "グローバルデストラクション" における信頼性です. それは Perl の実行の終了時に起こります. Perl はユーザのデータを含めて全てのデータを破棄します. もしデストラクタ(DESTROY 関数)が特定の順序でグローバルデストラクションが 行われることを考えていたのならこれは頭の痛い問題でしょう. 例えばあるオブジェクトのデストラクタにおいて他のクラスのオブジェクトが まだ有効であるのかはそれへの参照をもっていないのであれば推測できません. もし環境変数 PERL_DESTRUST_LEVEL が非ゼロ値に設定されているか, 生成されたスレッドを終了しているのなら通常のリファレンスやシンボルテーブルも 既に破棄されているでしょう. クラスメソッドやクラスの通常の関数を 呼ぶこともできません. ハッシュのランダム性はハッシュ要素が特定の順序であるという 隠れていた仮定や, 率直に言ってしまえばバグを暴くのは確かでしょう. Perl コアやコアモジュールにも少数ではありますが見つかりました. 実行時にハッシュのランダム化を無効化するのなら Perl の実行前に 環境変数 PERL_HASH_SEED に 0 を設定する(詳細は L 参照)か, もしくはコンパイル時に この機能を完全に無効化するために. C<-DNO_HASH_SEED> (F 参照) を設定してコンパイルするかです. この変更の背景となった根拠の原文は L を参照してください. =head2 ファイルハンドルの utf-8 フラグは locale 設定から直接影響を受けなくなりました Perl 5.8.0 では, 標準ファイルハンドルを含めた全てのファイルハンドルは, utf-8 を使うロケールが設定されているときには Unicode UTF-8 フラグを暗黙のうちに 設定していました. この機能は多くの問題を引き起こしたため廃止され, また 再設計されました: L<< |/コア機能の強化 >> を 参照してください. =head2 "=E" の前において1つの数字部分からなる v-string は文字列として扱われます Perl 5.6.0 から使えるバージョン文字列(v-string)機能 (L<|/バージョン文字列> 参照)は幾分 混乱を招きました. 主にそれを使うことを意図していなかったのにもかかわらず Perl が v-string であると認識してしまうコトが要因です. 特に厄介なのは "=>" の前においてバージョン文字列 ("v" とそれに続く 数字からなります) が文字列リテラルではなく v-string として 処理されてしまうというものです. 例をあげると, %h = ( v65 => 42 ); というコードは, Perl 5.6.0 以降では %h = ( 'A' => 42 ); (少なくとも ASCII 系のプラットフォームにおいては) この様に認識されて しまいます. Perl 5.8.1 ではこれをより自然に, 次の形に認識します. %h = ( 'v65' => 42 ); 複数の数字を持つ v-string, たとえば v65.66 や 65.66.67 は Perl 5.8 でも v-string として処理され続けるでしょう. =head2 (Win32) -C スイッチが再利用されました -C スイッチが互換性のない形で変更されました. このスイッチは以前は Win32 においてかつ 5.6.x リリースでの "use utf8" において意味を持ちましたが, 5.8.0 におけるユニコード実装の 課程で意味をなさなくなりました. このスイッチを使う人はいなくなったために これは再利用されました. 5.6.x リリースでこのスイッチを有効にした時の 振る舞いは透過的に, データに依存した形で今後のリリースでもサポートされる でしょう. このスイッチの新しい効果については L<< |/UTF-8 ロケールでも UTF-8 は初期状態で有効になることはありません >> 及び L を 参照してください. =head2 (Win32) cmd.exe の /d スイッチ Perl 5.8.1 では system(), バッククオート, 及び, 外部プログラムへのパイプ 等で内部で使用する cmd.exe シェルの実行時に /d スイッチを使います. その他のスイッチは, 外部プログラムを実行するときに通常望まれていないと 考えられるレジストリからの AutoRun コマンドの実行を無効化します. もし以前の振る舞いを維持したいのなら PERL5SHELL 環境変数に C と 設定して下さい. =head1 コア機能の強化 =head2 UTF-8 ロケールでも UTF-8 は初期状態で有効になることはありません Perl 5.8.0 から多くの Unicode 機能が展開されました. その中には便利という より厄介なものも見られました. ユーザのロケールに UTF-8 の使用が 記されていたときの, 自動的に(そして水面下で)行われるファイル ハンドルの "UTF-8-疑惑" です. 標準ファイルハンドルもその対象です. 例えば, もしロケールに C を指定していたのなら, STDIN 及び STDOUT は暗黙のうちに binmode(..., ":utf8") を行ったかのように自動的に "UTF-8" になります. これは出力時に, chr(0xff) を書き出したのに最終的には 0xc3 0xbf という2バイトが出力されることになります. Perl 5.8.0 のこの機能に気付いていなければ何が起こったのか理解するのは 難しいでしょう. この問題はかなり大多数の人々が気付きませんでした. 例えば RedHat リリース 8 及び 9 の B<デフォルトの> ロケール設定は UTF-8 でした. このためそのユーザは望まなくても UTF-8 ファイルハンドルを 扱うことになりました. この痛みは Perl 5.8.0 のバグのある Unicode 実装, 特に s/// 及び tr/// に関連する辺り(このバグは 5.8.1 では修正されて います)で激化しました. この結果, この機能は撤回され, 静かに暗黙のうちにおこなうのではなく 意識して明示的におこなう様に修正されました. 新しい Perl のコマンドラインオプション C<-C> 及びこれに対応する環境変数 PERL_UNICODE によって I/O の様に Perl で Unicode をどのように扱うかの インターフェースとして使うことができるようになりました. 詳細については L と L を参照して ください. =head2 安全ではないシグナルを再び利用できるようになりました Perl 5.8.0 において "安全なシグナル" と呼ばれる機能が実装されました. これはシグナルをすぐに処理するのではなく, 安全性を向上させるために "opcode の間で" 処理するようにしたものです. それまでのシグナルハンドラのその場での処理は Perl の内部状態を破壊し, 深刻なクラッシュを引き起こすことがありました. しかし新しい安全なモデルにもそれ故の問題がありました. Perl 内部命令の基本単位である opcode がその完了まで割り込まれなくなったために 時間のかかるいくつかの処理は本当に長時間にわたって実行し続けてしまいます. 例えばいくつかのネットワーク操作はそれ自身でブロッキングやタイムアウトの メカニズムを持っていますし, 状況がそろえばすぐに割り込むことができます. これらのことから 5.8.0 より前 (正確には 5.7.3 より前) での方法で シグナルを処理するための "バックドア" を設けました. 環境変数 PERL_SIGNALS に C を設定することでいままでの すぐに割り込む(しかし安全ではない)シグナル処理に戻ることができます. L 及び L を参照してください. 完全に関係のないニュースですが, POSIX::SigAction で 安全なシグナルを使うことが出来るようになりました. L を参照してください. =head2 配列のタイと負のインデックス これまでタイを処理する配列クラスの C 及び, C, C, C メソッドに渡されるインデックスは常に非負でした. 負のインデックスが用いられたときには Perl が FETCHSIZE を暗黙のうちに 呼び出してその結果をこれらのメソッドに渡す前にインデックス値に加算して いました. この振る舞いは今後は選択できるようになりました. タイを処理する配列クラスに C<$NEGATIVE_INDICES> というパッケージ変数があり その値が真であったときには, 負のインデックス値は変更されることなく C, C, C, C に渡されます. =head2 local ${$x} 以下の構文 local ${$x} local @{$x} local %{$x} によって変数のローカライズを行えるようになりました. $x には有効な変数の名前を与えてください. =head2 ユニコード文字データベース 4.0.0 Perl 5.8 に含まれる Unicode 文字データベースのコピーは 3.2.0 から 4.0.0 に更新されました. これは例えば Unicode 文字プロパティが Unicode 4.0.0 のものになったことを意味します. =head2 廃止機能に対する警告 新しい廃止が1つあります. Perl 5.8.0 ではいくつか廃止の警告を失念していたのでここで追加しておきます. 後は将来削除される実装についての再掲です. =head3 (再掲) 仮想ハッシュは本当に廃止されます 仮想ハッシュは Perl 5.8.0 において廃止され, Perl 5.10.0 において 削除されるでしょう. 詳細は L を参照してください. 仮想ハッシュへのアクセスは警告 C を発します. もし仮想ハッシュを警告なしに本当に使い続けたいのなら次のプラグマを 使ってください: no warnings 'deprecated'; もしくは L プラグマを使うことができますが, ハッシュ仮想化におけるデータ構造については手を触れないでください. =head3 (再掲) 5.005 形式のスレッドは本当に廃止されます 5.005 形式のスレッド (C によって使われるもの) は Perl 5.8.0 において廃止され, Perl 5.8 より後には削除されるでしょう. 詳細は L を参照してください. 5.005 形式のスレッドの生成は警告 C<5.005 threads are deprecated> を発します. もし 5.005 スレッドを警告なしに本当に使い続けたいのなら次のプラグマを 使ってください: no warnings 'deprecated'; =head3 (再掲) $* 変数は本当に廃止されます 複数行のマッチを制御する C<$*> 変数は Perl 5.8.0 において廃止され, Perl 5.8 より後には削除されるでしょう. この変数は長いこと前に廃止され, C という警告を 発してきましたがついに削除されます. この機能はパターンマッチ時の C 及び C 修飾子に引き継がれています. 5.005 形式のスレッドの生成は警告 C<5.005 threads are deprecated> を発します. もし C<$*>変数 を警告なしに本当に使い続けたいのなら次のプラグマを 使ってください: no warnings 'deprecated'; =head2 その他の機能 void コンテキストでの C は高価ではなくなりました. C は現在ではそのコンテキストを理解し, void コンテキストで 呼ばれたときにはリストを構築しません. ソケットに出力中にサーバから閉じられたときに, クライアントに SIGPIPE を受信するようになりました. この機能は予定されていませんでしたが PerlIO の変更ではなくて自然な動作からです. また不慮の自体を考慮する 為です. PerlIO::get_layers(FH) はそのファイルハンドルでアクティブな PerlIO レイヤ の名前を返します. PerlIO::via レイヤはそのレイヤが "auto-:utf8" をストリームに 対して必要とするかを示す UTF8 メソッドを任意で持つことが出来ます. utf8::is_utf8() がスカラーが内部で UTF-8 (Unicode) であるかを素早く 調べるために加えられました. =head1 モジュールとプラグマ =head2 更新されたモジュールとプラグマ 以下のモジュールとプラグマが Perl 5.8.0 から更新されています. =over 4 =item base =item B::Bytecode より使いやすい形になりました. まだ完全には遠いですが, トライしてみる 価値はあるでしょう. =item B::Concise =item B::Deparse =item Benchmark 任意の機能, C<:hireswallclock>, 高分解能ウォールクロックタイム (Time::HiRes の使用)を許可します. =item ByteLoader B::Bytecode 参照. =item bytes bytes::substr を持つようになりました. =item CGI =item charnames 独自の文字名の別名を持つことができます. =item CPAN CPAN.pm モジュールへの簡単なコマンドラインフロントエンド F が追加されました. =item Data::Dumper 新オプション, Pair, ハッシュのキーと値のセパレータを 選択できます. =item DB_File =item Devel::PPPort =item Digest::MD5 =item Encode encoding プラグマ機能(tr/// 及び DATA ファイルハンドル, format) における重要な更新. ファイルハンドルがあるエンコーディングと関連づけられているのなら マッピングできない文字は入力後(壊れたデータを使った時)ではなく入力時に 検出されます. ISO 8859-6 変換テーブルの修正(0x30..0x39 を U+0030..U+0039 ではなく U+0660..U+0669 に間違ってマッピングしていた). GSM 03.38 変換がエスケープシーケンスを正しく扱っていなかった. UTF7 エンコーディングの追加(Unicode::Stringと機能の互換). =item fields =item libnet =item Math::BigInt Perl v5.8.0 に添付されていた v1.60 以来多くのバグが修正されました. 特に注目するべき点としていくつかの大きな値で除算や剰余の計算に 失敗するバグや良くない入力の処理の修正があります. いくつかの新しい機能, 例えば broot() メソッドなど, config() にパラメータを渡すことによる実行時の設定変更, NaN 及び無限大の 生成のトラップなどが追加されました. 通常いくつかの最適化が行われ, math 全体をいくらか速めます. いくつかの状態では実際とても速くなります. とくに Math::BigInt::GMP の様な 代替ライブラリはこの恩恵を受けます. 加えて fsqrt() や flog() の様な とても冗長な処理はとってもすごく速くなります. =item MIME::Base64 =item NEXT ダイヤモンド状継承を扱えます =item Net::Ping =item PerlIO::scalar 文字列ではないスカラーからの読み込み (特殊な変数など, L 参照) が機能するようになりました. =item podlators =item Pod::LaTeX =item PodParsers =item Pod::Perldoc 完全に書き直されました. その副産物として root での起動が拒否されなく なりました. =item Scalar::Util 新しいユーティリティ: refaddr, isvstring, looks_like_number, set_prototype. =item Storable コードリファレンスの格納 (B::Deparse 経由, foolproof でなく). =item strict strict プラグマのこれまでのバージョンでは "import" (use) 及び "unimport" (no) ルーティンに暗黙に渡されたパラメータを調べていません でした. これは次のような間違った使用方法を招きました: use strict qw(@ISA); @ISA = qw(Foo); これはしかしながら (おそらく) refs, vars, そして subs は強制されている (そして @ISA はどうにかして "宣言されている"という)間違った例外を 発生させたでしょう. しかしこの間違った使用方法では refs, vars, subs の 強制はB<されません>. Perl 5.8.1 からは前述の例はエラーを発生させることにB<なります>. これはうわべは警告もエラーもなく実行されていたプログラムが 5.8.1 ではエラーとするでしょう. これは次のような文で use strict qw(@ISA); 以下のエラーを発生させるようになります: Unknown 'strict' tag(s) '@ISA' これを治療するには以下のような正しい使用方法に直すことです. use strict; use vars qw(@ISA); @ISA = qw(Foo); =item Term::ANSIcolor =item Test::Harness テストスクリプトの余計な及び足りない出力をよりピックアップ. =item Test::More =item Test::Simple =item Text::Balanced =item Time::HiRes 可能であれば nanosleep() の使用. alarm 群の subsecond sleeps のミックス. =item threads いくつかの修正, 例えば join() 問題やメモリリーク. glibc を使ういくつかのプラットフォーム(Linuxも含まれます)における 1つの ithread に使われる最小メモリ量を数百キロバイト単位で減少. =item threads::shared いくつかのメモリリークを修正. =item Unicode::Collate =item Unicode::Normalize =item Win32::GetFolderPath =item Win32::GetOSVersion より多くの情報を返すようになりました. =back =head1 ユーティリティの変更点 C ユーティリティは F ではなく 今風のレイアウト F を生成します. ボイラープレートテスト(?)は F ではなく F で呼び出すようになります. Perl デバッガ (F) の広範囲なドキュメント化及び ドキュメント記述中に見つかったバグの修正. C はより強健に機能的にするために新しく作り直されました. C は壊れ気味ですが C はいくらかましに機能 します. (Perl コンパイラ群はその全体が依然 experimental です.) =head1 新しいドキュメント perl573delta が追加されました. (いまではとても廃れている) 開発リリース 5.7.2 と 5.7.3 の相違点です. perl58delta が追加されました: perl 5.8.0 での perldelta です. 5.6.0 と 5.8.0 の詳細な相違点です. perlartistic が追加されました: pod format になっている Artistic License です. より簡単に参照を行えます. perlcheat が追加されました: Perl の cheat sheet です. (ごまかしシート??内容はハンディリファレンスみたいです.) perlgpl が追加されました: pod format になっている GNU General Public License です. より簡単に参照を行えます. perlmacosx が追加されました. Mac OS X での Perl のインストール方法と使用方法です. perlos400 が追加されました. OS/400 PASE での Perl のインストール方法と使用方法です. perlreref が追加されました: 正規表現のクイックリファレンスです. =head1 インストールと設定の改善 UNIX における標準的な Perl の位置, F は, 既にそれが存在するのなら上書きしないようになりました. この変化は身をわきまえたものです. おおくの UNIX ベンダーは 初めから F を提供していて, 同時に多くの システムユーティリティが Perl の実際のバージョンに依存しているでしょう. このため上書きしない方が望ましいと判断されました. site 及びベンダーの, マニュアル及びHTML ページ, スクリプトの インストールディレクトリを指定できるようになりました. F を参照してください. C 時に DESTDIR 変数に Perl のインストール先にしたい ディレクトリを指定することができるようになりました. (この機能は これまでの C とは少し違います.) F を参照してください. gcc バージョン 3.x は Perl のコンパイル時に多くのノイズとなる新しい警告を 発するようになりました: C. この警告は Configure がコンパイル前に その様なディレクトリを取り除くことで回避しています. Configure フラグ C<-Dnoextensions=...> 及び C<-Donlyextensions=...> を 使うことで Perl コアモジュールのサブセットをビルドすることが できるようになりました. F を参照してください. =head2 プラットフォーム固有の機能 Cygwin において threads で Perl をビルドできるようになりました (C). Cygwin 1.3.22 及び Cygwin 1.5.3 両方で動作します. 新しい FreeBSD において, F を使うために Perl 5.8.0 の コンパイルに失敗していました. FreeBSD においてこれはダミーであり, 使おうとすると致命的なエラーとなります. 現在は F を 使用しないようになりました. 日立 HI_UXMPP でビルドできます. LynxOS で再びビルドできます. Mac OS X はインストールディレクトリ名にバージョン番号を 埋め込んでインストールします. これはユーザがコンパイルした Perl のアップグレードを簡単にするため, そして 一般的なインストールディレクトリをより標準にするためです. 言い換えると, デフォルトのままインストールでも Apple が提供している Perl を 破壊してしまうことはありません. その一方で, C の指定をすることで Apple 提供の Perl を本当に置き換えることもできます(B<十分注意してください>). Mac OS X ではデフォルトでスタティックにリンクされた Perl が ビルドされるようになりました. この変更は主に起動の高速化の為です. Apple が提供している Perl はまだ共有, ダイナミックリンクされる ものです. 自分で Perl をビルドするときには C を指定することで共有を無効にできます. IBM の OS/400 PASE 環境で Perl を使えるようになりました. PASE 用の Perl を構築する最良の方法は, クロスコンパイル環境として AIX を 使うことです. README.os400 を参照してください. 別のクロスコンパイルオプションが追加されました: OpenZaurus, Sharp Zaurus PDA 用の Mandrake + Embedix な Linux ディストリビューション向けの の Perl を作成できます. Cross サブディレクトリを参照してください. Tru64 で gcc 3 を使用してるときに F の最適化を C<-O2> に 落としました. これはデフォルトの C<-O3> では巨大なメモリ消費を 引き起こすためです. Tru64 において新しい Berkeley DB で Perl をビルドできます. WinCE 上での Perl のビルドが高まりました. F 及び F を参照してください. =head1 バグ修正の抜粋 =head2 クロージャ, eval, レキシカル 無名関数, レキシカル, クロージャに対して多くの修正が施されています. Perl はより "精緻" になったといえますが欠点のあった振る舞いを信頼していた 既存のコードが動かなくなる可能性もあります. とはいえ実際にはこれはとても複雑にネストしている無名関数, eval, レキシカル がなければありそうもないことです. =head2 一般的な修正 もし入力ファイルハンドルが C<:utf8> と設定されていて C<< >> からの入力中に UTF-8 を見つけると, 警告が有効になっていれば - それを見送って後で不幸にも壊れたデータを受け取ることになって しまうかわりに - すぐに警告を発します. (C<:encoding(utf8)> レイヤを この目的に使うことも出来ます.) binmode(SOCKET, ":utf8") はソケットの入力側のみで出力側には 機能していませんでした. これは両方向で機能するように修正されました. スレッド Perl において getpwent() や getgrent() の様ないくつかの システムデータベース関数 は失敗の代わりにその結果格納バッファを動的に 拡大します. これは多くのユーザやグループを抱えるサイトでこれらの関数が 一部の結果だけを返して失敗することを回避します. Perl 5.8.0 はユーザが独自の大文字<->小文字 Unicode マッピング(Camel が 広告しているように)を定義する互換性を偶発的に破壊していました. この機能は修正され, ドキュメント化もされました. 5.8.0 において次のコード $some_unicode .= ; は正しく機能せずデータを破壊してしまいました. これは現在では修正されています. FETCH 等の様なタイされたメソッドでより安全にタイされた値に アクセスできるでしょう, すなわち FETCH 等が安全に再帰できます. とはいっても再帰を収束させるのはお忘れなき様. 起動時に Perl は それを処理できるまで SIGFPE シグナルをブロックします. これまでこのブロックは実際のところ Perl の中から実行されるプログラムのため でした. 現在では外部プログラムを実行する前に Perl は もとの SIGFPE ハンドラを復元します. Perl スクリプトにおいて行番号は 65535 若しくは 2**16 より大きく なれるでしょう. (Perl スクリプトは いつでもこれより大きな値を とることができます. これは単にエラーや警告時の行番号の持っている "ラップされた動作"です.) それほど大きなスクリプトはコードをちょっと考え直した方がいいコトを 示している一方で, その様なコードはスクリプトに生成されたコードなど として存在します. 現在では 4294967296 若しくは 2**32 まで到達できます. =head2 プラットフォーム固有の修正 Linux =over 4 =item * $0 が再び設定されます (Perl が行えない制限はあります: L 参照). =back HP-UX =over 4 =item * $0 の設定が機能するようになりました. =back VMS =over 4 =item * Configuration 時に C が提供されているかを調べ, 確認できれば IO::Poll は提供されている関数を使用します. =item * 特権モードで Perl イメージをインストールしたとき, もしくは プロセスの権限リストに設定されているサブシステムの属性を持った識別子が 存在したときに, Perl 起動時に稀にアクセス違反が発生します. これらの状況はポインタのバグを含んだ taint コードを起動しました. この誤ったポインタ演算は修正されています. =item * %ENV ハッシュでの(キーではなく)値に対する長さの制限は, 255 バイトから 32640 バイトに緩められました. (ただし PERL_ENV_TABLES 設定が %ENV の論理名に対するデフォルトの使用を上書きしている時を除きます.) Perl の外からこれらの長い値にアクセスする必要があるのなら, この機能がサーチリストを使って実装されていることを知っておかなければ なりません. 値は 255 バイトずつ (最大128個) の欠片として格納されます. Perl から %ENV を使うときには, 各要素が1つの値に結合されます. $ENV{'foo;N'} 構文 (N はサーチリストのインデックス) を使った サーチリストの論理名の個々の要素にアクセスするための VMS 由来の制限は ゆるめられてはいません. =item * パイプの実装はプロセス間通信においてグローバルな DCL ではなく ローカルなものを使うようになりました. =item * 論理名と衝突する名前を持つ相対位置のディレクトリにナビゲートするときに File::Find は混乱することがありました. この問題はディレクトリ構文に 相対パス名を追加することで修正されました. これにより論理名変換を 予防します. =back Win32 =over 4 =item * fork() エミュレーション時のメモリーリークが修正されました. =item * 5.8.0 で破損していた ioctl() 組み込み関数の復帰値が修正されました. =item * perl がブロッキング処理中に実行していた内部メッセージループが Perl の外へのメッセージと時々衝突しました. これはしばしば Perl が Windows メッセージを生成する環境下で実行しているときに ブロッキング動作に早すぎる終了や正しくない結果を返すことになりました. これは修正されています. =item * pipe と socket が自動的にバイナリモードになるようになりました. =item * 4引数の select() が呼び出し中にエラーが発生したときに $! (errono) を 適切に維持していなかったものが修正されました. =item * 4 引数の select() が呼び出し中にエラーとなったときに $! (errno) を 適切に保存していなかったのが修正されました. =back =head1 追加された及び変更された診断メッセージ pack() 及び unpack() に関連する全ての警告はより有益なものに, 矛盾のないものに 修正されました. =head2 変更 "%d 個のスレッドが実行中であるのにあるスレッドで exit が実行されました" 以前のメッセージ A thread exited while %d other threads were still running %d 個の他のスレッドがまだ実行中であるのにあるスレッドで exit が 実行されました は "他の" とあるのに警告となったスレッド自身も含まれていたために 誤解を生じていました. =head2 削除 "固定されているハッシュをクリアしようとしています" 固定されているハッシュのクリアは不正ではありません. そのためこの警告は削除されました. =head2 追加 "無名関数が不正に宣言されました" C にはコードブロックを指定しなければなりません. =head2 変更 "文字置換(tr)操作において無効な範囲 "%s" が指定されました" 以前のメッセージ Invalid [] range "%s" in transliteration operator 文字置換(tr)操作において無効な [] 範囲 "%s" が指定されました tr/// には "[] 範囲" がないという点で単純に間違っていました. =head2 追加 "\c の制御文字名がありません" それ自身が説明しています. =head2 追加 "左詰の文字列 %s に改行があります" 追加の空白が改行の後にあらわれました. これはおそらく予期したものではないでしょう. =head2 追加 "ビット演算 %c の優先順位が意図しない可能性があります" 次の条件 $x & $y == 0 が $x と $y のビット論理積が 0 であるとテストしたいのなら この警告は好ましいものでしょう. =head2 追加 "仮想ハッシュは廃止されます" この警告は 5.8.0 からあります. =head2 追加 "%s 状態のファイルハンドル %s から read() を行いました" 閉じられたもしくは開いていないファイルハンドルから read() (もしくは sysread()) は行えません. =head2 追加 "5.005 スレッドは廃止されます" この警告は 5.8.0 からあります. =head2 追加 "使用中のタイ変数が解放(free)されました" 生存中に栓を抜かれた何かが変数を解放します, Perl は安全のために保釈します. =head2 追加 "To%s: 不正なマッピング '%s'" 不正なユーザ定義の Unicode case マッピングが指定されました. =head2 追加 "イテレーション中に解放された値を使用しました" 何かがイテレートしている値を変更しました. これはよいことではありません. =head1 内部動作の変更点 これらのニュースは XS コードを書いているか Perl 内部を知りたかいもしくは ハックしている(Devel::Peek や C を使っている), もしくは C<-D> オプションで Perl を実行する人にのみ重要です. L にある埋め込みの例は最新に対応するため, そして矛盾をなくすために 書く改められました: 例えば PERL_SYS_INIT3() や PERL_SYS_TERM() の正しい 使用方法等です. Dave Mitchell によって pad コード(レキシカル変数に対して 責任を負っているコード)の広範囲の再活動がなされました. John Peacock による v-string の広範囲の動作. UTF-8 の長さと位置のキャッシュ: Unicode (UTF-8) スカラーの速度向上のために キャッシュが実装されました. 公式の API を経由しないで直接 SV の PV を 書き換えるエクステンションでは潜在的に問題となるでしょう: このときクリアされるべき UTF-8 キャッシュがクリアされないためです. Perl 5.8.0 で廃止された sv_2pv, sv_catpvn, sv_catsv, sv_setsv が 再び使えるようになりました. cxinc や regatom といった特定の Perl コアの C API が有効でなくなりました. これは故意に行われました. 今後短い名前で有効になるべきではありません. またアプリケーションでこれらに依存しているのなら(そのことを恥じるべきであり, そして) perl5-porters においてでなぜそれが適切であるのか説明して 議論してください. C といったいくつかの API が Perl_ プレフィックスなしでは 有効でなくなりました. もしいくつかの関数が見つからなくて XS モジュールが とまったら, いくつかのケースでは関数に C プレフィックスをつけて 関数呼び出しの最初の引数にスレッドコンテキスト C が加わることで 簡単になおるでしょう. これは常にそうされるべきでした: Perl_ の無い形式がコアから偶然漏れたのでしょう. よりきれいに埋め込むためにも, コンパイル時に cpp で PERL_NO_SHORT_NAMES を 定義して全ての API にこれを強制するべきでしょう. Perl_save_bool() が追加されました. (C で生成される) 正規表現オブジェクトは R-magic ではなく S-magic を 持つようになりました. これは /...(??{...;$x})/ 形式において $x に 施された修正を無視してしまわないように修正します. S-magic は最適化や マーキング (??{...})か構築した汚れのある低速度な(従って使われない) キャッシュを解除します. L も参照してください. Regexp::Copy がこの影響を受けます. Perl の内部でバック用マクロ DEBUG() 及び DEB() が名前の衝突を 避けるために PERL_DEBUG() 及び PERL_DEB() に変更されました. C<-DL> が削除されました. (リークテストは破損していて長いこと サポートされていません. 代わりにデバッグ malloc を使うか valgrind や Purify といったツールを使ってください.) 冗長修飾子 C が C<-DXv> 及び C<-Dsv> に追加されました. L を参照してください. =head1 新しいテスト Perl 5.8.0 では約 700 のテストファイルに およそ 69,000 のテストがありました. Perl 5.8.1 では約 750 のテストファイルに およそ 75,000 のテストがあります. 正確な数は Perl の設定やOSプラットフォームに依存して変化します. =head1 既知の問題点 L<< |/非互換となる変更点 >> に記述されている ハッシュのランダム性は明らかに未決定事項です: これは休眠しているバグを 目覚めさせ, 間違っていた仮定を揺り動かすでしょう. mod_perl 2.x を Perl 5.8.1 で使おうとしているのなら, mod_perl-1.99_10 以降を使う必要があるでしょう. mod_perl 2.x のそれ以前のバージョンでは ランダムなハッシュでは機能しません. (mod_perl 1.x では大丈夫です.) Apache::Test 1.04 以降も必要になるでしょう. 稀なプラットフォームの Perl 5.8.0 が 100% もしくはほぼ 100% 近く動作する 箇所の多くで, そのメンテナが多忙であったために幾分世話が遠くなっていました. その様なプラットフォームでは他のプラットフォームより失敗が多くなるでしょう. Max OS Classic, IBM z/OS (及び他のEBCDIC プラットフォーム), NetWare などが 当たります. 多くの共通の Perl プラットフォーム (Unix 及び Unixライクな プラットフォーム, Microsoft プラットフォーム, VMS) は良く行う十分の多くの テストとエキスパート人口があります. =head2 スカラーコンテキストでのタイされたハッシュの評価 これまでタイされたハッシュはスカラーコンテキストでは有用な値を 返していませんでした. 例えば真偽テストを次のようにしても: if (%tied_hash) { ... } これまでのばかげた振る舞いではハッシュが空か要素を持っているかに かかわらず常に偽となっていました. この根本的な原因はハッシュのスカラーコンテキストでの振る舞いを 実装するためのインターフェースが無かったことでした. =head2 Net::Ping 450_service 及び 510_ping_udp の失敗 lib/Net/Ping/t/450_service.t のサブテスト 9, 18, lib/Net/Ping/t/510_ping_udp.t のサブテスト 2 はあまりないネットワーク 設定を行っていると失敗します. 例えば後者は UDP ping を IP アドレス 127.0.0.1 に送ろうとします. =head2 B::C C言語を生成するコンパイラのバックエンドである B::C (フロントエンド は C になります)がいくらかこわれぎみです. 広範囲の レキシカル変数の変更によるものです. (朗報もあります. B::Bytecode 及び ByteLoader は改善されています. ) =head1 プラットフォーム固有の問題点 =head2 EBCDIC プラットフォーム IBM z/OS 及び他の EBCDIC プラットフォームは Unicode サポートに関して 不明確なままです. 多くのユニコードテストは修正すべき箇所をスキップ します. =head2 Cygwin 1.5 における問題 Cygwin 1.5 において F 及び F テストがいくつかの 未知の原因で失敗します. 1.5.5 ではスレッドテスト stress_cv, stress_re, stress_string が環境変数 PERLIO に "perlio" を設定 している時以外は失敗します(この時 io/tell も失敗します). が Perl 5.8.1 は Cygwin 1.3: (uname -a) C ではビルドでき, ちゃんと動作します. "make test" は C で 100% 成功します. =head2 HP-UX: HP cc は sendfile 及び sendpath について警告を発します いくつかの HP C コンパイラリリース (例えば B.11.11.02) では 次のような警告をだします(見やすいように改行しています): cc: "/usr/include/sys/socket.h", line 504: warning 562: Redeclaration of "sendfile" with a different storage class specifier: "sendfile" will have internal linkage. cc: "/usr/include/sys/socket.h", line 505: warning 562: Redeclaration of "sendpath" with a different storage class specifier: "sendpath" will have internal linkage. cc: "/usr/include/sys/socket.h", line 504: warning 562: 異なるストレージクラス指示子による "sendfile" の再宣言: "sendfile" は内部リンケージになります. cc: "/usr/include/sys/socket.h", line 505: warning 562: 異なるストレージクラス指示子による "sendpath" の再宣言: "sendpath" は内部リンケージになります. この警告は Perl のビルド中や C コンパイラを呼び出す lib/ExtUtils の テストで発生します. しかしこれは重大なものではなく無視することができます. =head2 IRIX: t/uni/tr_7jis.t 誤った失敗 いくつかの IRIX リリース (少なくとも IRIX 6.5 及び MIPSpro Compiler Version 7.3.1.1m) での 'make test' もしくは test harness において t/uni/tr_7jis.t が失敗と報告することが知られています. しかしこれは手動でテストしたときには完全にパスできます. =head2 Mac OS X: usemymalloc がありません すべての Mac OS X において Perl malloc (C<-Dusemymalloc>) は 機能しません. これはネイティブの malloc がきちんと動作してるので 大きな問題ではありません. =head2 Tru64: GNU cc (gcc) でスレッドをビルドできません 最近の Tru64 リリース (例えば v5.1B) において gcc (3.3) をスレッド Perl をビルドするために使えません(-Duseithreads). システムの C<< >> ファイルを gcc が見つけられないためです. =head2 Win32: sysopen, sysread, syswrite Perl 5.8.0 リリース現在で sysopen()/sysread()/syswrite() "テキスト" モード において 5.6.1 やそれ以前で使われていたような振る舞いをとりません. これらのビルトイン関数は (sysopen() に O_TEXT フラグを指定したり, binmode() をファイルハンドルに使ったとしても) "バイナリ" モードとして処理されます. このことはディスク上のファイルにのみ関係することで, Windows 版においては ソケットやパイプは常に "バイナリ" モードとなります. この振る舞いは現在はバグとして考えられ, 今後互換のある振る舞いが提供される でしょう. それまでは sysopen()/sysread()/syswrite() の使用時における "テキスト" モード操作はサポートされません. =head1 今後の展開 以下のことが今後おこるB<でしょう>. これらの特徴を持つ最初の公的なリリースは開発者リリース Perl 5.9.x になり, Perl 5.10.0 になるでしょう. これらは当時の最良となる推測です: 私たちは考え直す権利を持っています. =over 4 =item * PerlIO はデフォルトになるでしょう. 現在 (Perl 5.8.x) でも stdio をB<本当に>高速化する技術を使っているのなら stdio ライブラリを今でも使うコトができます. 今後のリリースでの目標は PerlIO を同じくらい高速にすることです. =item * I という新しい機能ができるでしょう. これは コードに散らされたアサーションと呼ばれるコードを持つことができるように なります: 通常これらは最適化で除去されますが, C<-A> オプションにより 実行することができます. =item * 新しい演算子 C (defined-or) が追加されるでしょう. 導入される式 $a // $b は次の式の代わりになり, defined $a ? $a : $b そして以下の式 $c //= $d; は, 以下の意味を持ちます. $c = $d unless defined $c; この演算子は C<||> と同じ優先度及び結合性を持っています. Perl 5.8.1 ソースに対するパッチは CPAN の F にあります. =item * C がデフォルトで C<$_> を unpack するようになります. =item * 速度向上の為に様々な書き込み時コピーが調査されています. =item * CPANPLUS 及び, Inline, Module::Build がコアモジュールになるでしょう. =item * 本当にレキシカルスコープなプラグマの記述が導入されるでしょう. =item * バイトコンパイラ及びバイトローダの開発は継続するでしょう. =item * 現在のバージョン文字列は廃止が予定されています. C, C, そして C<$VERSION> に使うときには v のつかない 形式 (1.2.3) が "バージョンオブジェクト" になるでしょう. $^V もまた "バージョンオブジェクト" になり, printf("%vd",...) 構造は必要なくなる でしょう. v 付きのバージョン (v1.2.3) は廃止されます. 文字列と バージョン文字列が同じ意味を持っていた状態 (例えば現在は 5.8.0 は "\5\8\0" と等価です) はなくなるでしょう. B<バージョン文字列の 廃止の警告はないでしょう>. バージョン文字列が安全に使用されているのか 安全ではないのかを認識するのはとても難しいことです. =item * 5.005 スレッドは削除されます. =item * C<$*> 変数は削除されます. (これはだいぶ前から廃止を言われています) =item * 仮想ハッシュは削除されます. =back =head1 バグレポート もしバグと思われるものが見つかったら, comp.lang.perl.misc ニュース グループに最近投稿された記事や http://bugs.perl.org/ にある perl バグデータベースを確認してください. Perl ホームページ, http://www.perl.com/ 情報はにもあります. もしまだ報告されていないバグだと確信したら, そのリリースに含まれている B プログラムをを実行してください. バグの再現スクリプトを十分小さく, しかし有効なコードに切りつめることを意識してください. バグレポートは C の出力と一緒に perlbug@perl.org に送られ Perl porting チームによって解析されるます. Perl 5 のバグについては http://bugs.perl.org/ で閲覧及び検索することができます. =head1 関連項目 F ファイルに変更点の完全な詳細があります. F ファイルに Perl のビルド方法があります. F ファイルに一般的なことがあります. F 及び F ファイルに著作権情報があります. =head1 和訳 山科 氷魚 (YAMASHINA Hio) 原典: perl VERSION 5.8.8. 翻訳日: 2003-09-28 (perl-5.8.1)