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