perldelta - perl v5.8.0での変更点
このドキュメントは 5.6.0 リリースと 5.8.0 リリースの変更点を記述しています。
5.8.0 に含まれるバグフィックスの多くは、5.6.1 というメンテナンスリリースにも 既に含まれていました。これら2つのリリースは、(5.8.0 がまだ 5.7.何番と 呼ばれていた頃には)密接に協調していたためです。
5.6.1 に統合された変更点には、[561] という印を付けてあります。これらの
変更点の中には 5.6.1 のリリース後にさらに開発が進んだものも多いのですが、
そういった変更点には [561+] という印を付けておきました。
5.6.1 に含まれる変更点一覧については、(5.005_03 からの変更も、5.6.0 からの 変更も含めて) perl561delta に書いてあります。
(5.8.0 における注目点)
Unicodeサポートの強化
新しい IO の実装
新しいスレッドの実装
数値精度の向上
安全なシグナル
多くの新しいモジュール
さらに広範囲な回帰テスト
(互換性のない変更)
(バイナリ非互換)
Perl 5.8 と以前リリースされた Perl のバイナリには互換性がありません。
XS モジュールは再コンパイルしなければいけません。
(ピュア Perl のモジュールは動作するでしょう。)
互換性がなくなった主な理由は PerlIO と呼ぶ新しい IO アーキテクチャのためです。 Perl 5.8 の新しい機能の多くが PerlIO を使用しているので、PerlIO はデフォルトで 組み込まれます。言い換えれば、残念ですが XS のコードを含んでいるモジュールは 再コンパイルしなければなりません。
PerlIO を意識しない XS モジュールは、将来リリースされる Perl で完全にサポート されなくなる可能性があります。しかし PerlIO は stdio インターフェイスを (ソースコードレベルで)差し替えるように設計されているので、モジュール作者へ 過度に負担がかかることはないでしょう。
プラットフォームによってはバイナリの互換性を無くした他の理由があるので 読み進めてください。
(64 ビットプラットフォームと malloc)
もしポインタが 64 ビット幅であれば、Perl の malloc が使われることは もうないでしょう。なぜならそれは 8 バイトのポインタでは上手く動かないからです。 また、通常そのようなプラットフォームでは、システムの malloc はそのような 大きなメモリモデルにおいて Perl の malloc よりもっと良い最適化がなされています。 PDL のようなメモリハングリーな Perl アプリケーションの中には Perl の malloc では 上手く動かないものもあります。最後に、Perl 以外のアプリケーション (例えば mod_perl)はシステムの malloc を好む傾向があります。 そのようなプラットフォームには Alpha, 64-bit HPPA, MIPS, PPC, Sparc などが あります。
(AIXのダイナミックローディング)
AIX リリース 4.3 またはそれ以降において AIX のダイナミックローディングは 以前のエミュレートされたインターフェースではなく AIX のネイティブ dlopen インターフェースを使うようになりました。この変更はおそらくコンパイルされた モジュールの後方互換性を破壊するでしょう。この変更は、AIX のネイティブ インターフェースを使っている mod_perl のような他のアプリケーションに、 Perl をより従わせるためになされました。
my variables now handled at run-time(実行時にハンドリングする my 変数の属性)
my EXPR : ATTRS 構文は実行時に変数の属性を適用するようになりました。
(サブルーチンおよび our 変数はいまだコンパイル時に属性を適用させます)
より詳しくは attributes を参照してください。しかし、これは特にtie
インターフェースにとって変数の属性を役立たせます。それは初期のリリースでは
不足していたことです。新しいセマンティクスは Attribute::Handlers モジュール
(のバージョン 0.76)では動かないことに注意してください。
(VMS での動的 Socket 拡張)
Socket 拡張は静的に組み込まれているのではなく動的にロードされるように なりました。これは古い VMS の TCP/IP スタックでは問題になるかもしれませんし ならないかもしれません。 Perl をそのような環境でテストすることができなかったので分からないのです。
(OpenVMS Alpha での IEEE フォーマットの浮動小数点)
Perl は IEEE フォーマット(T_FLOAT)を OpenVMS Alpha でのデフォルトの内部の 浮動小数点フォーマットとして使うようになりました。これは潜在的に外部 ライブラリや既存データのバイナリ互換性を破壊します。G_FLOAT はいまだ設定の オプションとして利用可能です。VAX (D_FLOAT)でのデフォルトは 変更されていません。
use utf8, almost)(新しい Unicode 機能 (もはやほとんどの場合 use utf8 は不要))
以前の Perl 5.6 では Unicode を使うために "use utf8" とすると、 (文字列連結のような)操作はそのレキシカルスコープ内では Unicode 対応となりました。
これは不便なインターフェースであることがわかりましたので、 Perl 5.8 では Unicode モデルは完全に変更されました: "Unicodeness" はデータ自体に結び付けられ、"use utf8" はほとんどの場合に 全く不要になりました。 残った唯一の"use utf8"の使い道は、Perl スクリプト自身が Unicode の UTF-8 エンコーディングで書かれているときです。 (すでに多くの Perl スクリプトがさまざまな 8 ビット文字セットを使って 書かれており、これらは UTF-8 では不正となるので、UTF-8 はデフォルトには なっていません。)
現在のモデルについては perluniintro を、 現在の utf8 プラグマの使い方については utf8 を参照してください。
(新しいUnicodeプロパティ)
Unicode スクリプト が新たにサポートされました。スクリプトというのは、 Unicode ブロック のようなものですが、それより上位のものです。 スクリプトとブロックの違いは、スクリプトが単一の言語または一群の言語により 使用されるグリフであるのに対して、ブロックというのは Unicode の番号付けに 基づく(高々)256 文字の人工的なグルーピングでしかないということです。
一般的にはスクリプトのほうがより多くの文字を含みますが、あらゆる場合に
そうである訳ではありません。例えば、Latinスクリプトは全ての Latin
文字といろいろな発音記号付きの文字を含みますが、いろいろな句読点や数字は
含みません(それらはLatinだけに属するわけではないので)。
他にもいくつかのプロパティが、新たにサポートされました。\p{L&},
\p{Any} \p{Assigned}, \p{Unassigned}, \p{Blank} [561],
\p{SpacePerl} [561] などです (もちろん \P{...} も)。
詳しくは、perlunicode を参照してください。
\p{...} や \P{...} と共に使われる名前に付けるプレフィックス
In と Is は、ほとんどの場合省略できることになりました。唯一の例外は、
ブロック名がスクリプト名と競合する場合です。その場合には、
Unicode ブロック名にプレフィックス In を付けて区別しなければなりません。
例えば、\p{Tibetan}はスクリプトを参照しますが、
\p{InTibetan}はブロックを参照します。名前の競合がない場合には、
ブロック名のInは省略できます(例:\p{BraillePatterns})が、安全のためには、
いつもInを使うのがたぶん良いでしょう。
(SCALAR(...)のかわりにREF(...))
リファレンスへのリファレンスは、ref() の返り値をより一貫したものにするために、 "SCALAR(0x81485ec)"のかわりに"REF(0x81485ec)"のように文字列化 されるようになりました。
(pack/unpack の D/F を再利用)
文書化されていなかった pack/unpack のテンプレートの文字 D/F はよりよい用途の ために再利用されました。現在これらはlong double(もしプラットフォームによって サポートされていれば)と NV (Perl の内部浮動小数点型)を意味します。 (これらは以前は d/f の別名でしたが、皆さんは知らなかったでしょう。)
glob() (あるいは<...>)から得られるファイル名のリストは、csh に従って デフォルトでアルファベット順にソートされるようになりました(これは大部分の UNIX プラットフォームで以前に起こったことです)。(bsd_glob() は、 GLOB_ALPHASORT が指定されなければ、いまだプラットフォーム依存で ASCII 順 または EBCDIC 順でソートします。) [561]
(非推奨事項)
bless(REF, REF) の意味は不明瞭なので、誰かがなんらかの意味をなすことを 証明するまでは禁止とします。
実験室から逃れることが決して許されなかったはずの廃れた chat2 ライブラリが 任務を解かれました。
明示的な chdir() の代わりに chdir("") や chdir(undef) を使うことには 疑問があります。失敗(chdir(some_function()) を考えてみてください)した 場合に chdir() が図らずもホームディレクトリに 移動してしまうかもしれませんので、この振る舞いは非推奨となりました。
組み込み関数 dump() は時代の流れにしたがって大半の有用性が失われて
来ました。コアダンプの関数は明示的に CORE::dump() を呼び出すことが
可能になっても残ることでしょうが、将来のリリースでは無条件に dump() を
呼び出した際、そのふるまいが変更されるかも知れません。
eg/ ディレクトリに入っているつまらない例は削除されました。おもしろい例を 提案することは歓迎しますが、主となる問題は例はドキュメントが書かれること、 及びテストされることと(一番大切なことですが)保守が必要だと言うことです。
(偽の)エスケープシーケンス \8 と \9 はオプショナルの警告("Unrecognized
escape passed through") を与えるようになりました。どの \w 文字も
\-escape する必要はありません。
*glob{FILEHANDLE} は非推奨となりました。 代わりに *glob{IO} を使ってください。
package; 構文(引数のない package)は非推奨になりました。
そのセマンティクスは明瞭でなく、その実装はさらに明瞭ではありませんでした。
もしこの特徴を完全修飾変数名でないものを全て許さないために
使っているのであれば、かわりに use strict; を使ってください。
実装されていない POSIX 正規表現の機能[[.cc.]]と[[=c=]]は、いまだ 認識されますが致命的エラーを出すようになりました。デフォルトで無視し 要求があれば警告を出すという以前の動作は、ある意味ではその機能が 使えていたと誤って思わせていたため、歓迎しがたいものでした。
PerlIO を意識しない XS モジュールは、将来リリースされる Perl で完全にサポート されなくなる可能性があります。PerlIO はソースコードレベルでは stdio の ちょっとした置き換えでしかないので、これはそれほど大変な変更には ならないはずです。
以前のバージョンの perl や、ラクダ本 III では
:raw "discipline" は :crlf の逆であることを暗示しています。
もはや完全にバイナリにするには "crlf 化" をオフにするだけでは不十分です。
PerlIO :raw 層 (あるいはラクダ本の古い用語では "discipline") が
公式に binmode(FH) と等価となりました - これは全てのバイトを
一切の変換なしにそのまま通過させるために必要なことをするものとして
定義されました。
特に、binmode(FH) - そして :raw も - はバイトストリームを
変更する CRLF と UTF-8 変換やその他の層 (つまり :encoding()) を
オフにします。
現在の pseudo-hashes のユーザに見える実装(配列の先頭要素のおかしな使い方)は、
Perl 5.8.0 から非推奨になり、Perl 5.10.0 で取り除かれ、その機能は違った
形で実装されるでしょう。現在のインターフェースはかなり醜いだけでなく、
現在の実装では通常の配列やハッシュの使用がかなり目立って遅くなって
しまいます。fields プラグマのインターフェースは利用可能なまま残る
でしょう。restricted hashes のインターフェースは代用のインターフェース
(Hash::Util を参照してください)になると考えられています。もし既存の
プログラムが根底にある実装に依存しているのであれば、CPAN の
Class::PseudoHash を使うことを考慮してください。
構文 @a->[...] と %h->{...} は非推奨になりました。
数年の試みの後、suidperl は本当に安全であると見なすには複雑になりすぎて いると考えられています。 おそらく suidperl の機能は将来のリリースで取り除かれるでしょう。
5.005 のスレッドモデル(モジュール Thread)は非推奨となり、Perl 5.10 で
取り除かれる予定です。マルチスレッド化されたコードは新しいiスレッドモデルに
移るべきです(threads, threads::shared, perlthrtut を参照してください)。
長い間非推奨であった文字列比較演算子の大文字の別名(EQ, NE, LT, LE, GE, GT)が取り除かれました。
tr///C と tr///U の機能が取り除かれました。もう二度と使えるようには ならないでしょう。インターフェースが間違っていました。 これについては申し訳ありません。 同じような機能としては、pack('U0', ...)と pack('C0', ...) を 参照してください。[561]
以前の Perl は"sub foo (@bar)"を"sub foo (@)"と同等に扱っていました。 プロトタイプは不正な構文についてコンパイル時によりよくチェックするように なりました。オプショナルの警告("Illegal character in prototype...")が 出されますが、将来のリリースでは致命的エラーに上がるかもしれません。
exec LIST と system LIST の操作は、将来のリリースでは汚染された
データに対して致命的エラーを出すようになるでしょう。
tie された配列やハッシュを local 化するときの現在の動作は間違っており、 将来のリリースにおいて変更されるでしょう。従って現在の動作を 頼らないでください。 "Localising Tied Arrays and Hashes Is Broken" を参照してください。
(コアの拡張)
(Unicode のオーバーホール)
Unicode は全体的に Perl 5.6.0(あるいは 5.6.1 さえ)よりもさらに使えるように なったはずです。Unicode はハッシュキー中に使われることが可能で、正規表現での Unicode、tr/// での Unicode、I/O での Unicode は動作するようになったはずです。 入門については perluniintro を、詳細については perluniintro を 参照してください。
Perl に付属する Unicode Character Database は Unicode 3.2.0 に アップグレードされました。 さらなる情報が欲しい場合は http://www.unicode.org/ を参照してください。 [561+] (5.6.1 では UCD 3.0.1 でした。)
Unicode の可用性を拡張することに興味がある開発者のために: 全ての UCD ファイルの大部分が Perl のディストリビューションのサブディレクトリ lib/unicore に含まれています。スペースの事情で省略してしまったものの中で もっとも特筆すべきは Unihan database です。
プロパティー \p{Blank} と \p{SpacePerl} が追加されています。
"Blank"は C の isblank() に似ていますが、"horizontal whitespace"
(スペース文字であって、改行ではない)で、"SpacePerl" は \s に相当する
Unicode です(垂直タブ文字が含まれているので \p{Space} ではありません、
一方 \s では垂直タブが含まれていないのです。)
先にこのドキュメントの Unicode プロパティーに関する変更点の追加情報にある "新しい Unicode プロパティー"を参照してください。
(PerlIOが標準に)
システムの"stdio"ではなく PerlIO が IO のデフォルトになりました。 PerlIO は"層"によってファイルハンドルの振る舞いを "強制"することを可能にしました。 層は 3 つの引数の形式で open する時に指定できます:
open($fh,'>:crlf :utf8', $path) || ...
もしくは拡張された binmode を使い、
既に開かれているハンドルに層を指定できます。
binmode($fh,':encoding(iso-8859-7)');
内蔵してる層は、unix(低レベルでの read/write)、 stdio (以前の Perl と同じ)、perlio (移植性のある形でにバッファ付き stdio を 再実装したもの)、crlf (Win32 での CRLF <=> "\n" 変換。 他のプラットフォームでも利用できる)があります。 (大部分の UNIX など)プラットフォームがサポートしていれば mmap 層が使用できます。
デフォルトで適用される層は 'open'プラグマで指定できます。
アーキテクチャごとの PerlIO に関する影響について /"Installation and Configuration Improvements" を参照してください。
もしプラットフォームが fork() をサポートしていれば、パイプに対してリスト
形式の open を使うことができます。例えば:
open KID_PS, "-|", "ps", "aux" or die $!;
これは ps(1) コマンドを(open() に対して引数が 3 つよりも多いので、シェルを
起動することなしに)fork し、その標準出力を KID_PS ファイルハンドルを
通して読み出します。perlipc を参照してください。
擬似層 ":utf8" を使うことで、 Unicode の Perl の 内部エンコーディング (プラットフォームによって UTF-8 か UTF-EBCDIC) を 受け入れること示す印をファイルハンドルにつけることができます:
open($fh,">:utf8","Uni.txt");
EBCDIC ユーザーへの注意: あなたが受け取るのは UTF-8 ではなく UTF-EBCDIC なので、擬似層の名前 ":utf8" というのは間違った命名です。 さらなる情報については perlunicode, utf8, http://www.unicode.org/unicode/reports/tr16/ を参照してください。 将来のリリースではこの名前は変わるかもしれません。 UTF-8 に関するさらなる情報については perluniintro を参照してください。
もし環境変数(LC_ALL, LC_CTYPE, LANG, LANGUAGE)が UTF-8 を使いたがっているように
見える(それらの変数のいずれかが /utf-?8/i にマッチする)ならば、
ハンドル STDIN, STDOUT, STDERR およびデフォルトの open 層(open を
参照してください)は UTF-8 にマークされます。(この機能は、Unicode と I/O を
結びつける他の新機能と同じように、PerlIO を使っている場合にのみ働きますが、
しかしそれがデフォルトです。)
この Perl 以降は本当に全てを UTF-8 だと仮定することに注意してください。 例えば、もしそうでない入力ハンドルがあれば、Perl はおそらくすぐに 入力データについて"Malformed UTF-8 ..."というように不平を言い出します。 なぜなら以前の 8 ビットのデータは全て UTF-8 を満たしていないからです。
コード作者に対する注意: ユーザが UTF-8 をデフォルトのエンコーディングと
して使えるようにしたいが、コードにはいまだ(例えば画像や zip ファイルのような)
8 ビットの I/O ストリームがある場合、open() や binmode() に対して明示的に
:bytes (perlfunc/open と perlfunc/binmode を参照してください)を
つけるか、あるいは単に binmode(FH) を使うことができます (5.8.0 以前の
後方互換性にとって良いでしょう)。
ファイルハンドルは読み書きの際":encoding()"層経由で Perl の内部的な Unicode 形式に、あるいは内部的な Unicode 形式から変換することが可能です。
ファイルハンドルを Perl のスカラーに保持されている"メモリ内"ファイルに 対して開くことができます。
open($fh,'>', \$variable) || ...
無名テンポラリファイルが 'use FileHandle' や他のモジュールを使う必要なしに 利用可能です。
open($fh,"+>", undef) || ...
これは正確に undef で、未定義の値ではありません。
(iスレッド)
Arthur Bergman による、マルチスレッドのための 新しいインタプリタスレッド(略して "iスレッド") 実装が 古い "5.005 スレッド" から置き換えられました。 iスレッドモデルではスレッド間で共有する全てのデータは明示的です。 threads, threads::shared, perlthrtut を参照してください。
iスレッド実装の一部として、Perl は必要で検出可能な 再入可能 libc インターフェースも使用します。
(制限ハッシュ)
制限ハッシュは使用するキーをある集合に制限し、 集合に含まれないキーを追加をすることを防ぎます。 さらにそれぞれのキーに対して削除や値の変更を制限することができます。 Hash::Util モジュールがそのインターフェイスになり、 新しい構文は複雑にはなりません。
(安全なシグナル)
シグナルが都合の悪い時にやって来ると Perl の内部状態が改変されてしまうと いう点で以前の Perl は壊れやすいものでした。しかし現在の Perl は安全になるまで (between opcodes)シグナルの扱いを引き延ばすようになりました。
この変更は、シグナルが Perl をただちに中断させなくなったため、驚くべき 副作用を持っているかもしれません。現在の Perl は、最初に例えば(sort() のような) 内部操作や(I/O 操作のような)外部操作を 1 つ完了することによって今行っている ことを終わらせ、その後にのみ(そして次の操作を開始する前に)受け取った シグナルを調べます。現在の操作が必ず初めに終わらせられるので内部状態の 改変は無くなりましたが、シグナルが効果を発揮するためにはより多くの時間が かかるかもしれません。しかし potentially blocking operations からの脱出は 今でも働くはずです。
(数字の解釈)
Perl の数字(整数及び浮動小数点の両方)の解釈の方面に関して全体的に多くの
修正がなされました。多くのシステムにおいて strtoul() や atof() のような
数字をパースする標準の関数がバグを抱えているように見えるので、Perl は
それらの欠陥に対処するように努めます。
上手くいけば数字がより正確になるでしょう。
Perl は、数の変換や基本計算(+ - * /)において、もし引数が整数ならば内部的に 整数値を使うように努め、さらに、内部的に整数として記憶された結果を 保持するように努めるようになりました。この変更により、わずかに速くなる ことがよく起こり、常により桁落ちの少ない計算方法になります。 (Perl は以前は常に計算時には浮動小数点数を優先していました。)
(配列は二重引用符で囲まれた文字列において常に展開されるように [561])
二重引用符で囲まれた文字列において、どんなことが起こるとしても、配列は 展開されるようになりました。Perl 5 の初期のバージョンでは、文字列が コンパイルされる以前にその配列が現れていればその文字列にその配列を展開し、 もし現れていなければ致命的なコンパイル時エラーを発生させるという動作を していました。バージョン 5.000 から 5.003 では、そのエラーは
Literal @example now requires backslash
(リテラル @example はバックスラッシュが必要になりました) でした。 バージョン 5.004_01 から 5.6.0 では、そのエラーは
In string, @example now must be written as \@example
(文字列内では、@example は \@example と書かなければならなくなりました) で
した。これは、リテラルの記号 $ が欲しければ "Give me back my \$5" と
必ず書いているように、リテラルの記号 @ が欲しければ
"fred\@example.com" と書く癖を人々に身に付けさせるためのものでした。
5.6.1 からは、@ 記号が二重引用符で囲まれた文字列内にあると、その配列が
すでに使われているか宣言されているかどうかに関係なく、その配列を
展開することを 必ず 試みます。致命的エラーはオプショナルの警告に
格下げされました:
Possible unintended interpolation of @example in string
(意図しない可能性のある文字列内での @example の展開)
これは、もし @ にバックスラッシュを付けなければ "fred@example.com" は
fred.com に変わるだろうという警告です。この経緯についての詳細は
http://www.plover.com/~mjd/perl/at-error.html を参照してください。
(その他の変更点)
AUTOLOAD は左辺値になれるようになりました。 つまり AUTOLOAD サブルーチンに :lvalue 属性を追加したり、 AUTOLOAD 返り値を割り当てたり出来るようになりました。
$Config{byteorder}(と config.h における対応する BYTEORDER)は sizeof(long) が 4 で sizeof(IV) が 8 のプラットフォームでは 間違っていました。バイトオーダーは sizeof(long) バイト長だけでした (1234 か 4321)が、正しく sizeof(IV) バイト長になりました (112345678 か 87654321)。 (これは Windows プラットフォームには影響を与えません。)
また、$Config{byteorder} は動的に算出されるようになりました-- これにより、複数のバイナリプラットフォームを含む実行イメージである "fat binaries"やクロスコンパイル時により頑強になりました。
perl -d:Module=arg,arg,arg が使用可能になりました。
(以前は複数の引数を渡すことができませんでした。)
do の後に裸の単語が続く場合、この単語はキーワードではないことが
保証されるようになりました(これは do q(foo.pl) が q という
名前のサブルーチンを呼び出そうとするバグを防ぐためです)。
つまり、do format() ではなく do &format() と書かなければならない
ことを意味します。
組み込みの dump() は現在オプショナルな警告である
dump() better written as CORE::dump()を出すようになりました。
それはデフォルトのdump(...)によるものはユーザーによって
定義された(可能性のある) sub dump としてではなく
core を出して中断する組み込みの dump() として解決されると言う意味です。
前者を呼び出すためには &dump(...) として下さい。
(dump() という形式全体が非推奨とされていますので、将来のリリースに備えて
可能な限り消去・変更するようにして下さい。)
chomp() 及び chop() はオーバーライド可能になりました。しかしながら、
プロトタイプ(prototype("CORE::chomp") によって与えられるもの)が
未定義で、理由はそれを表現することは不可能で、組み込まれているものを
オーバーライドする以外の方法が本当に無いからだと言うことに注意して下さい。
END ブロックは BEGIN ブロックで exit/die しても実行されるようになりました。 内部では、END ブロックの実行は PL_exit_flags & PERL_EXIT_DESTRUCT_END で 制御されるようになりました。これによって組み込み Perl での 新しい振る舞いが有効になります。これは 5.10 ではデフォルトになる予定です。 perlembed を参照してください。
フォーマットはゼロ埋めされた数値フィールドに対応しました。
"すべきではない"のですが、Perl のハッシュキーの順序に依存したコードを 書くことが可能でした(Data::Dumper が行っています)。 新しい"一期一会"アルゴリズムでは違ったハッシュキーの順序になります。 より詳しくは /"Performance Enhancements" にあります。
lstat(FILEHANDLE) という操作は意味を成さないので警告を出すようになりました。 将来のリリースでは致命的エラーになるかもしれません。
glob() が最初に File::Glob をロードさせる要因となるという状況で、 誤った構文エラーが生成されることが修正されました。[561]
左辺値のサブルーチンがリストコンテキストで undef を返すことが
出来るようになりました。しかし、左辺値サブルーチン機能は
未だ実験的です。[561+}
失われた警告"Can't declare ... dereference in my"が復活しています。 (初期の Perl はその警告を出しますが、その後のリリースでは失われていました。)
新しい特別な正規表現変数が導入されました:
$^N にはもっとも最近の閉じたグループ(部分マッチ)の内容が入ります。
no Module; はモジュールが unimport() メソッドを持っていない際でもエラーを
発生させません。これは use の振る舞いが import と比較して
類似しているからです。[561]
数を比較する演算子でどちらかのオペランドが NaN の場合 undef を返すように
なりました。以前はその振る舞いが不定でした。
our は複数のインタプリタ間でどのようにグローバル変数が共有されるかに
影響を及ぼす実験的でオプショナルな属性 unique を設定可能になりました。
perlfunc/our を参照してください。
次に挙げる組み込み関数はオーバーライド可能になりました: each(), keys(), pop(), push(), shift(), splice(), unshift() [561]
pack() / unpack() はテンプレート文字を () でまとめて、
グループに対して繰り返し/カウント修飾子を適用できるようになりました。
pack() / unpack() は Perl 内部数値タイプである IV, UV, NV を
処理できるようになりました。プラットフォームがサポートしていれば
long double も処理できます。
テンプレート文字はそれぞれ j, J, F, D です。
pack('U0a*', ...) は文字列を UTF-8 に強制するために使えるように
なりました。
my __PACKAGE__ $obj が動作するようになりました。[561]
sleep した秒数を返す CORE::sleep() とは逆に、POSIX::sleep() は (POSIX が標準でそうするように)sleep しなかった秒数を返すようになりました。
printf() と sprintf() は %\d+\$ と *\d+\$ と言う構文を用いることによって
パラメータの並べ替えができるようになりました。例えば、
print "%2\$s %1\$s\n", "foo", "bar";
は"bar foo\n"を表示します。この形式は国際化されたソフトウェアを書く際の 助けとなり、一般的にはパラメータの並びを変化させることができます。
プロトタイプ(\&)が適切に働くようになりました。
プロトタイプ(\[$@%&])は暗黙にリファレンスを作成することが可能になりました (tie() のインターフェースをエミュレートしたい場合に便利です)。
新しいコマンドラインオプションである -t が使用可能になりました。
これは -Tの ちょっとした弟分で、汚染違反の嵐で強制終了
させる代わりにレキシカル警告を発生させます。
これは古いレガシーなアプリケーションのコードを安全にする間
一時的なデバッグするのを助けるものであることを意味するだけです。
-T の代わりにはなりません。
汚染に関するその他のニュースとしては、
exec LIST と system LIST は危険すぎると考えることに
なりました(exec @ARGV を考えてみてください: あらゆるプログラムを
あらゆる引数で起動できます)。そしてレキシカル警告化では
このような形は警告を発生させます。
正当性を保証するために引数を注意深く洗浄するべきです。
将来のリリースでは Perl はこのような形式は致命的エラーとなるので、
今のうちに洗浄を検討してください。
tie されたハッシュのインターフェースは EXISTS と DELETE メソッドを 持っていることが要求されるようになりました(それ自身か継承される対象の どちらかがです)。
tr/// が単に文字を数えるだけの場合、ターゲットを変更しません。
untie() は UNTIE() フックが存在すれば、それを呼び出すようになりました。 詳細は perltie を参照してください。
utime はファイルのタイムスタンプを現在の時刻に変更するために
utime undef, undef, @files をサポートするようになりました。
定数のアンダースコア(アンダーバー)に関するのルールは緩和され シンプルになりました: 単純に 数字の間 であれば アンダースコアを含んでも構いません。
$^X は、C の argv[0](フルパス名が含まれていないかもしれません)に 依存するのではなく、オペレーティングシステムに問い合わせることで 設定するようになりました。 (Linux では /proc/self/exe、FreeBSD では /proc/curproc/file を 読み込みます。)
新しい変数, ${^TAINT}は汚染チェックモードが有効かどうかを示します。
ビルトインの readline() がオーバーライド可能になり、<FILEHANDLE>といった 角括弧の演算子も同時にオーバーライドします。
コマンドラインオプションである -s と -F は shebang(#!) 行を認識する ようになりました。
/c マッチ修飾子を /g を使わずに使った場合、警告を発生させます:
Use of /c modifier is meaningless without /g。
/c を置換で用いた場合、/g と共に使っても
Use of /c modifier is meaningless in s/// を発生させます。
/g を split で使用すると
Use of /g modifier is meaningless in split を発生させます。
CLONE 特殊サブルーチンが追加されました。
iスレッドでは、新しいスレッドが作成されたときに Perl データが
複製されますが、非 Perl データは自動的には複製されません。
CLONE で、非 Perl データの複製といった必要な処理を行うことができます。
CLONE はパッケージが定義されたり継承されたりする毎に一度実行されます。
新しいスレッドのコンテキストから呼び出されるので、
全ての変更は新しいエリアで行われます。
perlmod を参照してください。
(モジュールとプラグマ)
(新しいモジュールとプラグマ)
Damian Conway が作成し、現在 Arthur Bergman によって保守されている
Attribute::Handlers は、属性ハンドラを定義できます。
package MyPack;
use Attribute::Handlers;
sub Wolf :ATTR(SCALAR) { print "howl!\n" }
# その後、あるpackageでMyPackを使う、あるいは継承すると...
my MyPack $Fluffy : Wolf; # 属性ハンドラWolfが呼び出されます
変数とルーチンの両方とも属性ハンドラを持つことが可能です。ハンドラは ある型(SCALAR, ARRAY, HASH, CODE のいずれか)に特有であるか、あるいは まさにそのコンパイルフェーズ(BEGIN, CHECK, INIT, END のいずれかに特有である 可能性があります。Attribute::Handlers を参照してください。
Stephen McCamant による B::Concise は Perl 文法ツリーを
渡り歩いて、操作に関する簡単な情報を表示するための
新しいコンパイラバックエンドです。
出力は高度にカスタム化可能です。B::Concise を参照してください。[561+]
Tels による新しい bignum, bigint, bigrat プラグマは (the Math::BigInt, Math::BigFloat, Math::BigRat を バックエンドで使うことによって)透過的な bignum サポートを実装しています。
Sean Bruke による Class::ISA は、クラスの ISA ツリーのサーチパスを
レポートするためのモジュールです。
Class::ISA を参照してください。
Cwd は分離した性格を持つようになりました; 可能であれば XS 拡張
が使われ(これはより高速で、より安全で、より頑強であることが期待できます)、
不可能であれば、慣れ親しんだ Perl の実装が使われます。
Kenneth Albanowski によって作成され、
現在は Paul Marquess によって保守されている
Devel::PPPort が追加されました。
このモジュールは異なるバージョン間での XS モジュールにおける
移植性を向上させるために h2xs によって優先的に使用されます。
Devel::PPPort を参照してください。
Gisle Aas による、ダイジェスト(チェックサム)を計算するための
フロントエンドのモジュールである Digest が追加されました。
Digest を参照してください。
Gisle Aas による、RFC 1321 に従って MD5 ダイジェスト(チェックサム)の
算出を行う Digest::MD5 が追加されました。
Digest::MD5 を参照してください。
use Digest::MD5 'md5_hex';
$digest = md5_hex("Thirsty Camel");
print $digest, "\n"; # 01d19d9d2045e005c3f1b80e8b164de1
注意: 過去互換性のための MD5 モジュールはこの先
使われる見込みがなくなったため意図的に含まれていません。
PerlIO::via::QuotedPrint も参照してください。
Nick Ing-Simmons によって作成され、現在 Dan Kogai によって保守されている
Encode は異なる文字エンコーディング間を変換する
機構を提供します。Unicode, ISO-8859-1, ASCII のサポートは
コンパイル時にモジュール内に含まれます。他のいくつかのエンコーディング
(ISO-8859, CP*/Win*, Mac, KOI8-R, 3 通りの EBCDIC, 中国語, 日本語,
そして韓国語エンコーディングのような一部のもの)は含まれており
実行時にロード可能です。(スペースを考えて、
一番大きい中国語のエンコーディングは独自の CPAN モジュールである
Encode::HanExtra として隔離されており、Encode は利用可能な
場合利用するでしょう)。Encode を参照してください。
Encode モジュールによってサポートされたいかなるエンコーディングも PerlIO が使用されている場合":encoding()"層が使用可能です。
Hash::Util は新しい 制限ハッシュ へのインターフェースです。
(Jeffrey Friedl, Nick Ing-Simmons, Michael Schwern によるものです。)
Hash::Util を参照してください。
I18N::Langinfo はロケール情報の問い合わせに使えます。
I18N::Langinfo を参照してください。
I18N::LangTags は Sean Bruke によるもので、RFC3066 スタイルの
言語タグを扱うための関数を持ちます。I18N::LangTags を参照してください。
Nicholas Clark による ExtUtils::Constant は
拡張を書く人にとっての新しいツールで、インポート C ヘッダ定数の
XS コードを生成します。
ExtUtils::Constant を参照してください。
Filter::Simple は Damian Conway によるもので、フロントエンドで
Filter::Util::Call を簡単に扱えるようにしたものです。
Filter::Simple を参照してください。
# MyFilter.pm内で:
package MyFilter;
use Filter::Simple sub {
while (my ($from, $to) = splice @_, 0, 2) {
s/$from/$to/g;
}
};
1;
# ユーザーのコード内で:
use MyFilter qr/red/ => 'green';
print "red\n"; # このコードはフィルターがかけられ、"green\n"を出力します
print "bored\n"; # このコードはフィルターがかけられ、"bogreen\n"を出力します
no MyFilter;
print "red\n"; # このコードはフィルターがかけられず、"red\n"を出力します
File::Temp は Tim Jenness によるもので、簡単かつ移殖性があり
セキュアな方法でテンポラリファイル及びディレクトリを作ることを可能にします。
File::Temp を参照してください。
Filter::Util::Call は Paul Marquess によるもので、source filters を
Perl で書くためのフレームワークを提供します。大抵の場合には
フロントエンドの Filter::Simple を使う方法が好まれます。
<Filter::Util::Call> を参照してください。
if は Ilya Zakharevich によるもので、モジュールの条件付き
インクルードを実現するための新しいプラグマです。
libnet は Graham Barr によるもので、ネットワークプログラミング関連の Perl5 モジュールを集めたものです。 Net::FTP, Net::NNTP, Net::Ping(libnet の一部では ありませんが、関連しています), Net::POP3, Net::SMTP を参照してください。
Perl のインストールでは libnet は設定されません; 設定するためには libnetcfg を使って下さい。
List::Util は Graham Barrによるもので、sum(), min(), first(),
shuffle() などのようなリストに関する一般的なユーティリティサブルーチンが
集まったものです。
List::Util を参照してください。
Neil Bowers による Locale::Constants, Locale::Country, Locale::Currency
Locale::Language, Locale::Script が追加されました。
フランスは "fr"、アメリカドルは "usd"、日本は "ja" といった、
さまざまなロケール標準のコードを提供します。
use Locale::Country;
$country = code2country('jp'); # $country gets 'Japan'
$code = country2code('Norway'); # $code gets 'no'
Locale::Constants, Locale::Country, Locale::Currency, Locale::Language を参照してください。
Sean Burke による Locale::Maketext はローカライズフレームワークです。
Locale::Maketext と Locale::Maketext::TPJ13 を参照してください。
後者はソフトウェアローカライズに関する記事で、
The Perl Journal #13 に掲載され、許諾の元に再配布されています。
Tels からの Math::BigRat は Math::BigInt 及び Math::BigFloat と使う、
巨大な有理数を扱うためのモジュールです。
Math::BigRat を参照してください。
Memoize は Mark-Jason Dominus によるもので、
サイズを速度の引き換えにして関数を速くします。
Memoize を参照してください。
MIME::Base64 は Gisle Aas によるもので、
RFC 2045 - MIME (Multipurpose Internet Mail Extensions) に従って
base64 エンコードを可能にします。
use MIME::Base64;
$encoded = encode_base64('Aladdin:open sesame');
$encoded = encode_base64('Aladdin:open sesame');
$decoded = decode_base64($encoded);
print $encoded, "\n"; # "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="
MIME::Base64 を参照してください。
MIME:QuotedPrint は Gisle Aas によるもので、
RFC 2045 - MIME(Multipurpose Internet Mail Extensions) で
定義されている quoted-printable encoding でデータをエンコードすることを
可能にします。
use MIME::QuotedPrint;
$encoded = encode_qp("Smiley in Unicode: \x{263a}");
$decoded = decode_qp($encoded);
print $encoded, "\n"; # "Smiley in Unicode: =263A"
<PerlIO::via::QuotedPrint> も併せて参照してください。
NEXT は Damian Conway によるもので、メソッドの再ディスパッチの
ための擬似クラスです。NEXT を参照してください。
open は open() のためのデフォルトの I/O 層をセットするための
新しいプラグマです。
PerlIO::scalar は Nick Ing-Simmons によるもので、
"インメモリ" な Perl スカラのための上述した IO 実装を提供します。
これはまたローダブル PerlIO 層の例となっています。
その他の将来の可能性としては PerlIO::Array と PerlIO::Code があります。
PerlIO::scalar を参照してください。
PerlIO::via は Nick Ing-Simmons によるもので PerlIO 層として
振る舞い、(典型的には Perl コードで実装された) クラスで提供される
PerlIO 層の機能をラップします。
PerlIO::via::QuotedPrint は Elizabeth Mattijsen によるもので、
PerlIO::via クラスの一例です:
use PerlIO::via::QuotedPrint;
open($fh,">:via(QuotedPrint)",$path);
これは自動的に $fh への全ての出力を Quoted-Printable にコンバートします。
PerlIO::via 及び PerlIO::via::QuotedPrint を参照してください。
Russ Allbery による、新しい podpodspec 内で記述されている L<> リンクを
パースするための Pod::ParseLink が追加されました。
Joe Smith による Pod::Text::Overstrike が追加されました。
POD データをフォーマットされた overstrike 文章にコンバートします。
Pod::Text::Overstrike を参照してください。[561+]
Scalar::Util は blessed(), reftype(), tainted() のような、
一般的に使われるスカラーサブルーチンを選り集めたものです。
Scalar::Util を参照してください。
sort は sort() の振る舞いを制御する新しいプラグマです。
Storable は Perl データを高速でコンパクトなバイナリフォーマットで
ファイルに保存及びファイルから読み込むことで、
Perl データ構造に永続性を与えます。
Storable が Perl データ構造を直列化するので、
これによって深い階層的なデータ構造をコピーすることが出来ます。
Storable は Raphael Manfredi が作成しましたが、
現在は Abhijit Menon-Sen によって保守されています。
Storable は 二つの新しいハッシュ機能である Unicode キーと
制限ハッシュを理解するように拡張されました。
Storable を参照してください。
Damian Conway による Switch が追加されました。単に:
use Switch;
と宣言することによって switch と case が Perl で利用可能になります。
use Switch;
switch ($val) {
case 1 { print "number 1" }
case "a" { print "string a" }
case [1..10,42] { print "number in list" }
case (@array) { print "number in list" }
case /\w+/ { print "pattern" }
case qr/\w+/ { print "pattern" }
case (%hash) { print "entry in hash" }
case (\%hash) { print "entry in hash" }
case (\&sub) { print "arg to subroutine" }
else { print "previous case not true" }
}
Switch を参照してください。
Michael Schwern による Test::More は テストスクリプトを書くための
フレームワークの一種で、Test::Simple より拡張されています。
Test::More を参照してください。
Test::Simple は Michael Schwern によるテストを書くための基礎となる
ユーティリティです。Test::Simple を参照してください。
文字列から区切られた一連のテキストを展開するための、
Damian Conway による Text::Balanced が追加されました。
use Text::Balanced 'extract_delimited';
($a, $b) = extract_delimited("'never say never', he never said", "'", '');
$a は"'never say never'"になり、 $b は', he never said'になるでしょう。
extract_delimited() に加えて、extract_quotelike(), extract_variable(), extract_tagged(), extract_multople(), gen_delimited_pat(), gen_extract_tagged() も存在します。これらによって、 より発展したパースのアルゴリズムを実装することが可能になります。 Text::Balanced を参照してください。
Arthur Bergman による threadsは、インタプリタスレッドへの
インターフェースです。インタプリタスレッド(iスレッド)は Perl5.6 で導入された
新しいスレッドモデルでしたが拡張機能を書く人に対して内部形式の
インターフェースのみしか利用できませんでした
(また、Win32 の Perl では fork() のエミュレーションのためのものでした)。
threads, threads::shared, perlthrtut を参照してください。
threads::shared は Artur Bergman によるものですが、インタプリタスレッドで
データを共有することを可能にします。
threads::sharedを参照してください。
Tie::File は Mark-Jason Dominus によるもので、
Perl の配列をファイルの行と関連付けます。
Tie::File を参照してください。
Tie::Memoize は Ilya Zakharevich によるもので、
オンデマンドで読み込まれるハッシュを提供します。
Tie::Memoize を参照してください。
Tie::RefHash::Nestable は Edward Avis によるもので、ハッシュの
リファレンスを格納することを可能にします(標準の Tie::RefHash とは
異なるものです)。本モジュールは Tie::Refhash に含まれています。
Tie::RefHash を参照してください。
Time::HiRes は Douglas E. Wegcheid によるもので、高精度の
時間操作(ualarm, usleep, gettimeofday)を提供します。
Time::HiRes を参照してください。
Unicode::UCD は Unicode 文字のデータベースへのクエリーの
インターフェースを提供します。
Unicode::UCD を参照してください。
Unicode::Collate は SADAHIRO Tomoyuki によるもので、Unicode 文字列を
ソートするための UCA(Unicode Collation Algorithm) の実装です。
Unicode::Collate を参照してください。
Unicode::Normalize は SADAHIRO Tomoyuki によるもので、
さまざまな Unicode の正規化方法を実装しています。
Unicode::Normalize を参照してください。
XS::APItest は Tim Jenness によるもので、XS API を学ぶためのテスト拡張です。
現在のところ printf() のみがテストされています:
XS からさまざまな基本データを出力する方法です。
XS::Typemap は Tim Jenness によるもので XS タイプマップを
学ぶためのテスト拡張です。
何もインストールされませんが、コードは拡張を書く人々にとっては
学ぶ価値のあるものです。
(更新または改善されたモジュールとプラグマ)
以下の独立してサポートされているモジュールが CPAN から最新のバージョンに更新されました: CGI, CPAN, DB_File, File::Spec, File::Temp, Getopt::Long, Math::BigFloat, Math::BigInt, the podlators bundle (Pod::Man, Pod::Text), Pod::LaTeX [561+], Pod::Parser, Storable, Term::ANSIColor, Test, Text-Tabs+Wrap.
attributes::reftype() は tie された引数で動作するようになりました。
AutoLoader は no AutoLoader; によって無効にすることが
可能になりました。
B::Deparse は Robin Houston によって大きく拡張されました。 ほとんど全てのテストスイートを逆パースできるようになりました (テストは成功するままです)。 これを試すための make ターゲットは "test.deparse" です。
Carp はよりよいインターフェースドキュメントが付き、 @ISA と独立してエラーがどこで報告されるかを追加で制御するための @CARP_NOT インターフェースが Ben Tilly によって追加されました。
Class::Struct はコンパイル時にクラスを定義できるようになりました。
Class::Struct はアクセサが 単一で 配列/ハッシュの要素の引数を伴って、 呼び出された場合、その配列/ハッシュの要素を割り当てます。
Cwd::fastcwd() の返り値は汚染されるようになりました。
Data::Dumper にはハッシュをソートするオプションがつきました。
Data::Dumper には B::Deparse を使ったコードリファレンスをダンプする オプションが付きました。
DB_File は新しいバージョンの Berkeley DB に対応し、 さまざまな改良も行われました。
Devel::Peek に Perl のメモリ状況のためのインターフェースが 追加されました(これは perl の malloc を使っていて、 デバッグモードでコンパイルされているときにのみ動作します)。
English モジュールは以下のように書くことで性能に影響を 与えずに使うことができるようになりました。
use English '-no_match_vars';
(もちろん、問題のある $`, $&, or $' を使わないことを仮定しています。)
また、@- と @+ の別名として @LAST_MATCH_START と
@LAST_MATCH_END が導入されました。
ExtUtils::MakeMaker は大幅にクリーンアップされ、修正されました。 拡張されたバージョンは Perl の以前のリリースにもバックポートされ、 CPAN に登録されたので、以前のリリースでも修正を享受できます。
Makefile.PL における WriteMakefile() の引数は以前より注意深く、 正確なチェックを行うようになりました。 これはモジュールがインストールされるとき 新たな警告を発生させることでしょう。 さらなる詳細は ExtUtils::MakeMaker を参照してください。
ExtUtils::MakeMaker は、移植性が高まるように内部で File::Spec を 使うようになりました。
Fnctl, Socket, Sys::Syslog は Nicholas Clark によって 新しいスタイルの継続的なディスパッチセクションを用いるため書き直されました (ExtUtils::Constant を参照してください)。 これはより強力で高速化が期待されることを意味します。
File::Find のシンボリックリンクの追跡の際の chdir() の動作が 正確になりました。[561]
File::Find は処理前後にコールバックを持つようになりました。 また、シンボリックリンクを追うときに正しくディレクトリを 変更するようになりました。 "return;" ではなく "next;" で終了する(行儀の悪い) コールバックも 動作するようになりました。
File::Findは(再び)再入可能になりました。より移植性が高くなっています。
File::Find による警告は自身のカテゴリに従うようになりました。
use/no warnings 'File::Find'; によってオン/オフできます。
組み込みの glob() と名前が重複してしまうため、File::Glob::glob() は File::Glob::bsd_glob() に名前を変更されました。古いほうの名前は 互換性を保つためにまだ利用可能ですが、非推奨です。[561]
File::Glob は、返されるファイル名のリストのサイズを制限するための
GLOB_LIMIT 定数に対応しました。
IPC::Open3 で数値のファイル記述子が使えるようになりました。
IO::Socket に atmark() メソッドが追加され、ソケットが out-of-band マークの 位置にある場合に真を返します。 このメソッドは sockatmark() 関数としてエクスポートされます。
IO::Socket::INET はサービス名が不明な場合、特定のポートを開くのに 失敗していました。 与えられたポート番号そのままを使うように修正されました。[561]
IO::Socket::INET が(プラットフォームが対応していれば) ReusePort オプションに 対応しました。Reuse オプションは ReuseAddr というエイリアスを持ちます。 明確化のために、ReuseAddr の方を使いたいと思うかもしれません。
IO::Socket::INET は LocalPort にゼロを指定できるようになりました
(普通これはオペレーティングシステムが値を決定することを意味します)。
'use lib' は @INC と全く同じように動作するようになりました。 'no lib' でディレクトリを削除できるようになりました。
Math::BigFloat と Math::BigInt は Tels によって完全に書き直されました。 大きく高速化され、バックエンドとして GMP や PARI のような さまざまな bignum ライブラリに対応しました。 =item *
Math::Complex は inf, NaN などをよりよく扱うようになりました。
Net::Ping は Rob Brown によってかなり拡張されました: マルチホーミングに対応し、Win32 の機能が改善され、 時間計測機能(TIme::HiRes を使った高精度計測にも対応しています)が 追加されました。 また、外部 ping ユーティリティを使って出力をパースする、 Net::Ping::External モジュールによって「外部」プロトコルに 対応しました。 Net::Ping::External は CPAN で入手可能です。
Net::Ping のテストの一部は Perl ディストリビューションで 実行するときに無効になっていることに注意してください。 これは、localhost の有効な echo ポート、完全なインターネット接続性、 同情的なファイアウォールといった情報を仮定できないためです。 Perl テストスイートを実行する前に環境変数 PERL_TEST_Net_Ping を "1" に 設定することで Net::Ping の全てのテストが有効になります。
POSIX::sigaction() はより柔軟で頑強になりました。 コードリファレンス、'DEFAULT', 'IGNORE' のハンドラや、 アトミックでない新しいハンドラを設定できます。
Safe では、use/require が動くように %INC は Safe コンパートメントの
中ではローカル化されます。
DOS 風プラットフォームでの SDBM_File において、 "穴"のあるファイルに対応していないためにキーのいくつかが 失われていました。 この問題の回避策が追加されました。
Search::Dict において、検索された行のためのプリプロセスフックが 追加されました。
Shell モジュールに OO インターフェースが追加されました。
Sys::Syslog において、メッセージのロギングに成功するまで 次の接続を行うというフェイルオーバー機構が追加されました。
Test モジュールは大幅に拡張されました。
Time::Local::timelocal() はもはや小数の秒を扱いません。 この理由は、localtime() が対応していないということと、 timelocal() と localtime() は互いに対称であると想定されるからです。
vars プラグマは完全修飾変数の宣言に対応しました。
(our() は対応せず、対応の予定もありません。)
utf8:: 名前空間は(プラグマのように) Perl の内部 Unicode 表現への
低レベルアクセスを提供するさまざまな Perl から呼び出せる関数を提供します。
現在のところ length() のみが実装されています。
(ツールの変更)
Emacs perl mode (emacs/cperl-mode.el) はバージョン 4.31 に 更新されました。
emacs/e2ctags.pl は遥かに速くなりました。
enc2xs は Encode モジュールに独自のエンコーディングを追加するための
ツールです。
h2ph は C トライグラフに対応しました。
h2xs は README のテンプレートを生成するようになりました。
h2xs は Perl の異なるバージョンの間での移植性を高めるために
Devel::PPPort を使うようになりました。
h2xs は新しい ExtUtils::Constant モジュールを
使うようになったので、定数を定義する新しく作成された拡張に影響を与えます。
新しいコードはより正しく(ある定数がもう一つの定数の接頭辞となっているような
二つの定数がある場合、一つ目の定数は 決して 定義されません)、
誤差が少なく(古いコードは整数定数にも浮動小数点数を使っていましたが、
整数定数には整数を使うようになりました)、
少し速くなりましたので、すでにある拡張コードを再生成することを考慮するべき
かもしれません(新しいスキーマは簡単に再生成できます)。
h2xs は C トライグラフにも対応しました。
libnet を設定するために libnetcfg が追加されました。
perlbug はより頑強になりました。
また、perl.com ではなく perl.org にバグレポートを送信します。
perlcc は書き直され、ユーザーインターフェース(つまりコマンドライン)は
より UNIX C コンパイラである cc と近いものになりました。
(perlbc ツールは削除されました。代わりに perlcc -B を使ってください。)
perlcc はいまだ非常に実験的で未サポートであることに注意してください。 [561]
perlivp は Perl インストール後にいつでも使える
新しいインストール検証手順ユーティリティです。
piconv は文字変換ユーティリティ iconv の実装で、
新しい Encode モジュールのデモ用です。
pod2html はキャッシュディレクトリを指定できるようになりました。
pod2html は XHTML 1.0 を生成できるようになりました。
pod2html は異なる改行コード(PC 風の CRLF と UNIX 風の LF と
MacClassic 風の CR)で書かれた POD を理解するようになりました。
s2p は完全に Perl で書き直されました。
(これは実際のところ sed の Perl による完全な実装です:
psed ユーティリティを使うことで sed の機能を使うことができます。)
xsubpp は *.xs に組み込まれた POD ドキュメントを理解するように
なりました。
xsubpp は OUT キーワードに対応しました。
(新しいドキュメント)
perl56delta はリリース 5.005 と 5.6.0 の違いに関する詳細です。
prtlclib は標準 C ライブラリ関数の内部置き換えについてのドキュメントです。 (拡張を書く人と Perl コアのハッカーにのみ興味があるものです。)[561+]
perldebtut は Perl デバッグのチュートリアルです。[561+]
perlebcdic は Perl を EBCDIC プラットフォームで動作させる場合に 考慮するべきことを記述しています。[561+]
perlintro は Perl の穏やかな説明です。
perliol は PerlIO と層の内部について記述しています。
perlmodstyle はモジュールを書くときのスタイルガイドです。
perlnewmod は新しいモジュールを書いて、登録する方法を 記述しています。[561+]
perlpacktut は pack() のチュートリアルです。
perlpod はより明確にするためと、何年にも渡って行われてきた ベストプラクティスを記録するために書き直されました。
perlpodspec は pod フォーマットに関するよりフォーマルな仕様書で、 主に pod を書く人ではなく、pod アプリケーションを書く人のためのものです。
perlretut は正規表現のチュートリアルです。[561+]
perlrequick は正規表現のクイックスタートガイドです。 実際、perlretut より遥かに素早く始められます。[561]
perltodo は更新されました。
perltootc は perltooc に名前が変わりました (ファイル名が"8.3"に制限されているファイルシステムで perltoot と 競合しないためです)。
perluniintro は Perl で Unicode を使うための説明です。 (perlunicode はより詳細なリファレンスと背景情報です)
perlutil は Perl ディストリビューションと共に配布されている コマンドラインユーティリティの説明です。[561+]
以下のプラットフォーム固有のドキュメントが利用可能です。 インストール前は README.platform、インストール後は perlplatform という名前です。
perlaix perlamiga perlapollo perlbeos perlbs2000
perlce perlcygwin perldgux perldos perlepoc perlfreebsd perlhpux
perlhurd perlirix perlmachten perlmacos perlmint perlmpeix
perlnetware perlos2 perlos390 perlplan9 perlqnx perlsolaris
perltru64 perluts perlvmesa perlvms perlvos perlwin32
これらのドキュメントは通常以下のような内容の詳細がが記されています: 設定、ビルド、テスト、インストール、そのプラットフォームで Perl を 動かすときに関係する内容。
東アジアの Perl ユーザーは自身の言語で迎えられることになりました: README.jp (日本語), README.ko (韓国語), README.cn (簡体中国語), README.tw (繁体中国語) は通常の pod として書かれていますが、 それぞれ EUC-JP, EUC-KR, EUC-CN, Big5 でエンコードされています。 これらは以下の名前でインストールされます。
perljp perlko perlcn perltw
POSIX-BC プラットフォームのドキュメントは "BS2000" と呼ばれます。 Perl POSIX モジュールと混乱しないためです。
WinCE プラットフォームのドキュメントは perlce (ソースコードキットでは README.ce) という名前です。 8.3 制限のファイルシステムで perlwin32 ドキュメントと混乱しないためです。
(性能の向上)
map() は生成した結果のリストが元のリストよりも大きいときに 病的に遅くなることがありました。 そのパフォーマンスが一般的な場面において改善されました。[561]
sort() は、sort 関数自身が sort() を呼ぶことができるという意味で、 完全に再入可能です。 それは以前のリリースでは確実には動作しませんでした。[561]
sort() は今まではクイックソートでしたが、代わりにマージソートを
使うようになりました。非常に小さいリストではソート時間が少し
遅くなりますが、一般的には少なくとも 20% は高速化されるはずです。
追加の利点としては最悪の場合の sort() の振る舞いが改善されます
(コンピュータ科学の表現では、クイックソートでは最悪の場合に
実行時に Theta(N**2) かかっていたものが O(N log N) になります)。
そして sort() は安定したものになります
(つまり同じキーを持つ要素はソート前と同じ順序になります)。
詳しくは sort プラグマを参照してください。
詳細を検討するための想定: 円周率の一部を自分で提供したいと仮定します。
@digits = ( 3,1,4,1,5,9 );
数値の数値ソートは予想通り (1,1,3,4,5,9) となります。
どちらの 1 が最初に来るのかはわかりにくいです。
なぜなら片方の 1 はもう片方とかなり良く似ているからです。
このことは全くつまらないことと考えるかもしれませんし、
何か深遠なことと考えるかもしれません。
しかし、もし偶数を奇数の前にしたくて以下のように書いたとします:
sort { ($a % 2) <=> ($b % 2) } @digits;
結果は?唯一の偶数である 4 が最初に来ます。
しかし、比較すると全て同じになる奇数はについては?
Perl 5.6 以前で実装されていたクイックソートアルゴリズムでは、
同点の場合の順序はソートに委ねられます。
従って、円周率の数値を追加するにつれて、
ソートされた偶数と奇数の順序は変わります。
また、十分に多い数の円周率の場合は、Perl 5.8 のクイックソート
アルゴリズムは、同じ入力のソートを再実行した場合でも
同じ結果にはなりません。
これの正当化は、クイックソートの最悪の場合の振る舞いと
共に残ります。
以下を実行すると:
sort { $a <=> $b } ( 1 .. $N , 1 .. $N );
(二つのソートされた配列を sort を使ってマージしたいと 仮定します)、$N の値を 2 倍にした場合、クイックソートに掛かる時間は 2 倍ではなく、 4 倍 になります。 クイックソートの実行時間は最悪の場合で N**2 で増えることになるため、 4 倍の 振る舞いと呼ばれ、これは通常の使用のパターンでも発生しえます。 これは小さい配列の場合は注意する必要はありませんが、 大きい配列の場合は 注意する必要があります。 そしてあなたは何百万要素もあるような配列のソートが終わるまで 長生きできないかもしれません。 それで、5.8 のクイックソートは大きな配列の場合は 4 倍の振る舞いから 守るためにはソート前に配列をかき混ぜます。 しかしこれは、もし同じ大きな配列をもう一度ソートすると、 同点の場合の挙動は色々は方法で変わることを意味します。
同点の時の優先順位が予測不可能であることと、 最悪の場合に 4 倍の振る舞いをするので、 クイックソートは安定したマージソートに ほとんど 完全に置き換えられました。 安定した とは、同点の場合は入力配列での出現順が保存されるということです。 従って:
sort { ($a % 2) <=> ($b % 2) } (3,1,4,1,5,9);
では (4,3,1,1,5,9) という結果が保証されます。 偶数と奇数は入力で現れた順に出力にも現れます。 マージソートは最悪の場合でも理想値である O(N log N) の振る舞いを示します。 そして皮肉にも、クイックソートで 4 倍になるような場合に特によい性能を 示します: (1..$N, 1..$N) のソートは O(N) 時間です。 しかしクイックソートは、ある種の入力とプラットフォームでは マージソートより速いという理由で最後の瞬間に救出されました。 例えば、偶数と奇数の順番を 気にしない のであれば、 クイックソートは O(N) 時間で実行されます; これは異なった少しの要素を何回もソートするにはよいものです。 クイックソートの分割統治戦略は比較的小さいがとても早いキャッシュをもつ プラットフォームでよく動きます。 最終的に問題はキャッシュに収まるサイズに分割され、 それによりメモリ速度工場の恩恵を受けられます。
クイックソートは、ソートの様相を制御する sort プラグマの実装によって
救出されました。 stable 副プラグマはアルゴリズムに関わらず
安定した振る舞いを強制します。
_quicksort と _mergesort 副プラグマは内在する実装を
選択する荒っぽい方法です。
先頭の _ は、この副プラグマが 5.8 以降まで生き残らないかもしれない
ことを示しています。
実装を選択するためのより適切な機構がありますが、
クイックソートの救出には間に合いませんでした。
ハッシュは Bob Jenkins の"一期一会"ハッシュキーアルゴリズム ( http://burtleburtle.net/bob/hash/doobs.html )を使うようになりました。 このアルゴリズムは十分に高速で、古いハッシュアルゴリズム (Chris Torek によって書かれ、後に Ilya Zakharevich に変更されたもの)より 値の拡散がよいです。 このアルゴリズムによる全ての 3 文字の印字可能な ASCII 文字によるキーの ハッシュ値は DIEHARD 乱数生成テストをほとんど通過するものです。 perlbench によれば、この変更は Perl 全体の速度に影響を与えません。
unshift() は目立つほど速くなったはずです。
(インストールと設定の改善点)
(全般的な改善点)
INSTALL に 非 64-bit プラットフォームで Perl を 64-bit 整数を使うように 設定する方法の説明が追加されました。
Policy.sh のポリシーが変更されました: Policy.sh ファイルを 再利用して(INSTALL を参照してください)、 Configure -Dprefix=/foo/bar を使い、 古い Policy で $prefix eq $siteprefix and $prefix eq $vendorprefix の 場合、これら全てが新しい接頭辞である /foo/bar に変更されます。 (以前は $prefix のみが変更されていました。) この新しい振る舞いを好まない場合は、prefix, siteprefix, vendorperfix を 明示的に指定してください。
Perl ライブラリの追加の位置を指定するための otherlibdirs が 利用可能になりました。 Perl 自身のライブラリディレクトリを使わずにベンダーアドオンを インストールするためなどに使えます。
多くのプラットフォームで、ベンダーが提供する 'cc' は Perl を ビルドするには機能が低すぎます(基本的に、'cc' は ANSI C ではありません)。 この場合にあたると考えられ、'cc' が GNU C コンパイラでないような 場合、代わりに 'gcc' を使うために自動的に検索します。
gcc はビルドの問題を避けるためにオペレーションシステムのリリースを 追いかける必要があります。実行されているオペレーティングシステムと 違う環境で gcc がコンパイルされているのを Configure が発見した場合、 問題があるかもしれないことを明確に警告として出力します。
Perl 5.8 は以前のバージョンとバイナリ互換性がありませんので、 @INC に 5.005 モジュールを含めることを提案しなくなりました。
Configure -S は非対話的に実行できるようになりました。[561]
Configure の pdp11-スタイルメモリモデルは古いものになっていますので 取り除かれました。
configure.gnu はオプションに空白が入っていても動作するようになりました。
installperl は出力を全て STDERR に行うようになりました。
PerlIO がほとんどのプラットフォームでデフォルトになったので、 "-perlio" は $Config{archname} ($^O としても知られます) に 追加されなくなりました。 代わりに、明示的に perlio を使わないことを選択した (Configure コマンドラインオプション -Uuseperlio)場合、 "-stdio"が追加されます。
アーキテクチャ名に関するその他の変更としては、 "-64all"(-Duse64bitall または "maximally 64-bit") は ポインタが 64 ビット長 の場合にのみ追加されます。 (正確には、use64bitall が無視されます。)
AFS インストールで、Configure でパラメータ -Dafsroot=/some/where/else を
使うことで、AFS のルートをデフォルトの /afs 以外に設定することができます。
ほとんど知られていない設定時定義である APPLLIB_EXP どドキュメントが 作成されました。これはサイト固有のディレクトリを Perl の デフォルト検索パス (@INC) に追加するために使えます。 情報については INSTALL を参照してください。
Perl (とおそらくは DB_File 拡張)がビルドされたときに使われた
Berkeley DB のバージョンが、Perl からは
@Config{qw(db_version_major db_version_minor db_version_patch)} で、
C からは DB_VERSION_MAJOR_CFG DB_VERSION_MINOR_CFG DB_VERSION_PATCH_CFG で
得られるようになりました。
DB, NDBM, ODBM のために Berkeley DB3 を互換性モードでビルドする方法が INSTALL に記述されました。
(ネットワーク経由か、CD-ROM のようなローカルコピーによって) CPAN に アクセスできる場合、-Dextras=... オプションを使って Perl と共にビルドおよびインストールする追加のモジュールを Configure に 指定することが出来ます。 さらなる詳細については INSTALL を参照してください。
config.over に追加して、新しい上書きファイルである config.arch が 利用可能になりました。 このファイルはヒントファイルを書く人が (config.over がサイトでの変更のためにあるのと違って) アーキテクチャでの変更を扱うことを想定しています。
ファイルシステムがシンボリックリンクに対応している場合、 以下のようにして Perl をソースディレクトリの外側でビルドすることが できます:
mkdir /tmp/perl/build/directory cd /tmp/perl/build/directory sh /path/to/perl/source/Configure -Dmksymlinks ...
これは /tmp/perl/build/directory に /path/to/perl/source にある ファイルを指すシンボリックリンクのツリーを作成します。 元のファイルには影響はありません。 Configure が終了した後、単に以下のようにすることで:
make all test
全て /tmp/perl/build/directory ディレクトリ内でで Perl が ビルド、テストされます。[561]
Perl 開発者のために、プロファイリングやデバッグのための 新しい make のターゲットが追加されました; perlhack を参照してください。
Perl のプロファイリングを 行う gprof ツールの使い方が perlhack に記述されました。 gprofile 化された Perl 実行ファイルを生成するための "perl.gprof" という make ターゲットがあります。
GCC 3 がある場合、範囲解析のための gcov 化された Perl 実行ファイルを 生成するための "perl.gcov"という make ターゲットがあります。
IRIX か Tru64 プラットフォームの場合は、 新しいプロファイリング/デバッギングオプションが追加されました。 pixie と Third Degree に関するさらなる情報については perlhack を 参照してください。
最小の Perl インストールを構築するためのガイドラインが INSTALL に追加されました。
Thread 拡張は i スレッドの基では(Configure -Duseithreads)
ビルドされなくなりました。とにかく動作しないからです
(Thread 拡張は Configure に -Duse5005threads を指定する必要があります)。
5.005 のスレッドは非サポートで、非推奨であることに注意してください: 古いスレッドを使ったコードは新しい i スレッドモデルに 移るべきです.
浮動小数点を文字列化するための Gconvert マクロ ($Config{d_Gconvert}) は 変換に sprintf %.*g ルールを使うことに関してよりうるさくなりました。 gcvt を使えていたプラットフォームでも、より遅い sprintf を使うことに なるものもあります。
perl に特殊な(デバッグなど)機能を付けるための以下のように指定する:
make LIBPERL=libperld.a
古いメソッドは取り除かれました。代わりに -DDEBUGGING を使ってください。
(新しい、もしくは改善されたプラットフォーム)
Perl に対応しているとわかっているプラットフォームの一覧については、 perlport/"Supported Platforms" を参照してください。
AIX の動的ローディングはよりよく対応するようになりました。
AIX は gcc、スレッド、64-bit 化に関してよりよく動くようになりました。 また AIX での long double の対応も改善されました。 perlaix を参照してください。
AtheOS ( http://www.atheos.cx/ ) は新しいプラットフォームです。
BeOS で再び動作するようになりました。
DG/UX プラットフォームで 5.005-スタイルのスレッドに対応しました。 perldgux を参照してください。
DYNIX/ptx プラットフォーム(dynixptx としても知られます) は OS バージョン 4.5.2 あたりから対応されました。
EBCDIC プラットフォーム (z/OS (OS/390 としても知られます), POSIX-BC, VM/ESA) が復活しました。多くのテストスイートテストは未だに失敗し、 Unicode と EBCDIC の共存がすっかり解決したわけではありませんが、 状況は Perl 5.6 の頃より遥かに改善しました。 さらなる情報については perlos390, perlbs2000 (POSIX-BC), perlvmesa を 参照してください。
-Duseithreads または -Duse5005threads 付きの perl のビルドは HP-UX 10.20 以前でも動作するようになりました(以前は10.30 以降でのみ 動作していました)。 スレッドライブラリパッケージのインストールが必要です。 README.hpux を参照してください。[561]
Mac OS Classic はメインストリームソースパッケージで対応することに なりました(perl 5.004 からの MacPerl ももちろん利用可能ですが、 標準の Perl と MacPerl のソースコードベースは同期しています)。[561]
Mac OS X(Darwin)では、HFS+ ファイルシステムでも Perl をビルドできるように なりました。 (大文字小文字を無視するので Perl ビルドプロセスを混乱させていました。)
NCR MP-RAS に対応しました。[561]
全ての NetBSD 固有のパッチ(インストール固有のパッチを除きます)が メインディストリビューションにマージされました。
Novell の NetWare に対応しました。 perlnetware を参照してください。
NonStop-UX に対応しました。[561]
NEC SUPER-UX に対応しました。
全ての OpenBSD 固有のパッチ(インストール固有のパッチを除きます)が メインディストリビューションにマージされました。
Perl は GNU pth ユーザーレベルスレッドパッケージ ( http://www.gnu.org/software/pth/pth.html ) でテストされました。 Perl の全てのスレッドテストは動作しましたが、 テストにいくつかの yield() を追加する必要がありました。 そのため、pth (とその他のユーザーレベルスレッド実装) は Perl iスレッドで"動作する"と考えらえられますが、 スレッド実装に内在するノンプリエンプティブ性の可能性について 考慮してください。
Stratus VOS は Perl のネイティブビルド手法 (Configure) で対応されました。 これが VOS で Perl をビルドする場合の推奨される手法です。 miniperl をビルドする古い手法もまだ利用可能です。 perlvos を参照してください。[561+]
Amdahl UTS UNIX メインフレームプラットフォームに対応しました。[561]
WinCE に対応しました。perlce を参照してください。
z/OS (以前は OS/360 として知られ、その前は MVS OE として知られていました)は 動的ローディングに対応しました。 これはデフォルトでは選択されませんので、Configure の引数として -Dusedl を指定する必要があります。[561]
(バグ修正の抜粋)
多くのメモリリークと未初期化メモリへのアクセスが修正されました。 最重要なものとしては、無名 subs がかなりメモリリークしていました。[561]
autouse プラグマは Multi::Part::Function::Names で動作していませんでした。
caller() はある種の状況ではコアダンプを引き起こしていました。
Cart は時々この問題の影響を受けていました。
特に、caller() はシンボルテーブルから削除されたサブルーチンでは
サブルーチン名として (unknown) を返すようになりました。
chop(@list) をリストコンテキストで使うと、 逆順で chop した文字列を返していました。 これは正しい順序に戻されました。[561]
Configure は Perl バイナリをビルドするときに DBM ライブラリ (dbm, gdbm, db, ndbm) を含めないようになりました。 唯一の例外はこれらが必要な SunOS 4.x です。[561]
"0x23" といった、10 進ではない数値文字列定数の振る舞いは プラットフォーム依存でした: 35 として扱うプラットフォームもあれば、 0 として扱うプラットフォームもあり、 小数点として扱うプラットフォームもありました(聞かないで下さい)。 これは、Perl は文字列を数値に変換した結果が未定義のときに オペレーションシステムのライブラリを使っていたからです: Perl は一貫して数値コンテキストではこれらの文字列をゼロとして 扱うようになりました。
いくつかのデバッガの修正: 終了コードはスクリプトの終了コードを
反映するようになりました; 条件 "0" を正しく扱えるようになりました;
d コマンドは行番号をチェックするようになりました;
$. は壊れなくなりました;
RemotePort がセットされた場合、デバッガの全ての出力が
正しくソケットに向かうようになりました。[561]
デバッガ (perl5db.pl) は (CommandSet=580) を通して より一貫したコマンドインターフェースを持つように修正されました。 この変更をテストするためと、将来のテストのプレースホルダとして perl5db.t が追加されました。
perldebug を参照してください。
デバッガに、ネストした構造をダンプする場合の最大の深さを制御するための
dumpDepth オプションが追加されました。
x コマンドは拡張され、x N EXPR とすると
EXPR の値を最大 N レベルの深さまでダンプ出力します。
デバッガは、CPAN モジュールである PadWalker がインストールされていると レキシカル変数を表示できるようになりました。
DESTROY の順序はより予測可能になりました。
Perl 5.6.0 ではモジュールを静的に perl にビルドした場合、 dl_error() の再定義に関する偽の警告を出力することがありました。 これは修正されました。[561]
dprofpp -R は動作しませんでした。
*foo{FORMAT} が動作するようになりました。
無限を数として認識するようになりました。
UNIVERSAL::isa は正しくメソッドをキャッシュするようになりました。 (これが 5.6.0 の Tk 拡張を壊していました。)[561]
レキシカルその 1: eval "" の外側のレキシカルが まだトップレベルの eval "" 化コードから参照されていない場合、 eval "" 内部のサブルーチン定義で正しく解決されていませんでした。
レキシカルが、ファイルスコープから、レキシカルが定義される前の サブルーチンにリークしていました。
レキシカルの警告がスコープと eval "..." の間で正しく
伝播するようになりました。
use warnings qw(FATAL all) は狙いどおりに動作していませんでした。
これは修正されました。[561]
warnings::enabled() は呼び出し側がレキシカル警告を使っていない場合に $^W の状態を正しく報告するようになりました。[561]
eval と #line での行番号の振り直しが動作するようになりました。[561]
多くのメモリリーク、特に eval "" でのメモリリークが修正されました。
tie した変数をローカル化してもメモリリークしなくなりました。
use Tie::Hash;
tie my %tied_hash => 'Tie::StdHash';
...
# Used to leak memory every time local() was called;
# in a loop, this added up.
local($tied_hash{Foo}) = 1;
ローカル化したハッシュ要素 (と %ENV)は、 それがもともとローカル化されていなかった場合は 存在しないように非ローカル化されるようになりました。
use Tie::Hash;
tie my %tied_hash => 'Tie::StdHash';
...
# Nothing has set the FOO element so far
{ local $tied_hash{FOO} = 'Bar' }
# This used to print, but not now.
print "exists!\n" if exists $tied_hash{FOO};
この修正の副作用として、tie されたハッシュインターフェースは EXISTS と DELETE のメソッドを定義 しなければならない ことに なりました。
mkdir() は POSIX で要求されているように、ディレクトリ名の 末尾のスラッシュを無視するようになりました。
glibc の中には modfl() が壊れているバージョンがあります。
これは -Duselongdouble でビルドしたときに影響を受けます。
このバージョンの Perl はこの問題を検出し、回避策をとります。
glibc 2.2.2 リリースは modfl() バグが修正されていると
わかっています。
符号なし数の剰余が動作するようになりました (4063328477 % 65535 は 27406 を返していましたが、27047 を 返すようになりました)。[561]
5.6.0 でのいくつかの "not a number" 警告は 5.005 との互換性を 高めるために除去されました。 無限は数値として認識されるようになりました。[561]
数値変換は特定の状況では文字列値の変更を正しく 認識できていませんでした。[561]
(:shared のような) 属性が our() で動作していませんでした。
our() 変数で余分な "Variable will not stay shared" 警告を 出さなくなりました。[561]
並んだ二つのブロックで同じ名前で宣言されている "our" 変数があるとこの変数に対する余分な"再定義"警告が出ていました。 問題は修正されました。[561]
pack "Z" は正しく文字列を "\0" で終端するようになりました。
シャドウパスワードを使っているプラットフォームのいくつか (HP-UX など)において getpwent() が別のエントリを返していた パスワードルーチンが修正されました。
(Perl にコマンドライン引数を渡すための) PERL5OPT 環境変数が 複数の組のオプションを渡せていませんでした。[561]
PERL5OPT が組み込み空間では動作していませんでした。
printf() は数値ロケールを "C" にリセットしなくなりました。
qw(a\\b) は正しく 'a\\b' とパースされるようになりました:
これは 4 文字ではなく 3 文字です。[561]
以前のバージョンでは s///ge の中では pos() が正しい値を 返していませんでした。正しく扱えるようになりました。[561]
(64 bit 整数対応のプラットフォームでは) printf/sprintf において、q L ll 接頭辞をつけなくても 64 bit 整数を表示できるようになりました。
リファレンスとオーバーロードされた正規表現が動作するようになりました。[561+]
右辺値マジック (GMAGIC) は、文字列連結などの多くの場合に 多く呼び出され過ぎていました。
scalar() は無効コンテキストで使われてもスカラコンテキストを 強制するようになりました。
SOCKS 対応は遥かに頑強になりました。
sort() の引数は正しい wantarray コンテキストでコンパイルされるように なりました(図らずも sort() 自身のコンテキストを使うようになっていました)。 比較ブロックはスカラコンテキストで実行され、 ソートされる引数は常にリストコンテキストで提供されます。[561]
POSIX 文字クラス [[:space:]] に(めったに使われない)垂直タブ文字を
含むように変更されました。水平空白(現在のところ、空白とタブ)を示す
新しい POSIX 風文字クラスである [[:blank:]] が追加されました。
sprintf() の汚染された場合の振る舞いが合理的なものになりました。 浮動小数点フォーマットの結果はもはや汚染されず、 文字列の変換の場合と一貫性のある振る舞いをするようになりました。[561]
(ハッシュの値のような)一貫性のない汚染の伝播が修正されました。
Perl 5.6.0 の RE エンジンは図らずもある種の単純なパターンマッチで 悲観的になっていました。これらはよりよく扱われるようになりました。[561]
(use re 'debug' か -Dr かによらず)正規表現デバッグ出力は
よりよく見えるようになりました。[561]
"a\nxb\n" =~ /(?!\A)x/m のような複数行マッチに不具合がありました。
このバグは修正されました。[561]
$& を使うと状況によってはコアダンプを引き起こすことがありました。 これは修正されました。[561]
正規表現が捕らえた部分マッチング($1, $2, ...)は、マッチングが 失敗したとき、間違ったデータが入っていましたが、 より一貫してリセットされるようになりました。[561]
"slurp" モードでオープンしたファイルに対する readline() が、 ある種の状況では余分の "" (空行) を返すことがありました。 これは修正されました。[561]
(${$num} での) perlvar に記述された特殊変数の
シンボリックリファレンスの自動活性化が図らずも無効になっていました。
これは再び動作するようになりました。[561]
Sys::Syslog は LOG_AUTH 定数を無視していました。
マルチスレッドでの同時に $AUTOLOAD, sort(), lock() およびサブプロセスの 起動を行ってもスレッドセーフになりました。
Tie::Array の SPLICE メソッドは壊れていました。
修正されない tr/// の左側に読み込み専用文字列を置くことが できるようになりました。
STDERR を tie したとき、warn と die による警告が
正しく渡されるようになりました。
いくつかの Unicode 関係の修正が行われました。
Perl ファイル(スクリプト、モジュール) が BOM(byte order marks) で 始まっていても透過的にスキップするようになりました。 UTF-16 と UCS-2 でエンコードされた Perl ファイルも正しく 読み込めるようなりました。
文字テーブルは Unicode 3.2.0 に更新されました。
utf8 データの比較は、非 utf8 データを utf8 に自動的にアップグレード していませんでした。(これは例えば I/O からのデータと Unicode データを 混ぜるときに問題になります: 出力は自動的に UTF-8 としてエンコード されているかもしれません。)
U+FFFE, や UTF-16 サロゲートのような、不正な Unicode コードポイントの 生成にオプションの警告を出力するようになりました。
IsAlnum, IsAlpha, and IsWord がtitlecase にマッチするように
なりました。
変数変換、eq, substr, reverse, quotemeta, x 演算子、
s/// による変換、シングルクオートされた UTF-8 経由での
. 演算子による連結が動作するようになりました。
tr/// 演算子が動作するようになりました。
tr///CU の機能は取り除かれました(pack('U0', ...) を参照してください)。
eval "v200" が動作するようになりました。
Perl 5.6.0 は m/\x{ab}/ を間違って解釈し、間違った警告を出していました。 これは修正されました。[561]
IsDigit のような Unicode クラスにゼロエントリがありませんでした。
大きな符号なし数(2**31 以上) が、符号なしであるという情報が 失われてしまい、数値演算子でおかしな結果を引き起こすことがありました。[561]
Perl パーサはランダム入力とマルコフ連鎖入力の両方を使った ストレステストを受け、発見されたいくつかのクラッシュとハングアップが 修正されました。
(プラットフォーム固有の変更と修正点)
BSDI 4.*
Perl は 4.0 以降の BSD/OS でも動作するようになりました。
All BSDs
$0 が動作するようになりました(できるだけは; 詳細については
perlvarを参照してください)。
Cygwin
大量の更新が行われました; 現在のところ Cygwin 1.3.10 と同期しています。
以前は DYNIX/ptx は Configure による 非ブロック I/O の検出に問題がありました。
EPOC
EPOC 対応が改善されました。 README.epoc を参照してくだっさい。[561]
FreeBSD 3.*
3.0 以降の FreeBSD でも動作するようになりました。
HP-UX
README.hpux が更新されました; Configure -Duse64bitall が
動作するようになりました; Perl malloc ではなく HP-UX malloc を
使うようになりました。
IRIX
大量のコンパイルフラグとヒントが拡張されました; 図らずも 32-bit と 64-bit のライブラリが混ざっていた(破滅的な試みです)のが より強固になりました。
Linux
long double が動作するようになりました (INSTALL を参照してください)。[561]
Linux では accept(), recvfrom() (Perl での: recv()), getpeername(), getsockname() を使うときに sockaddrlen に関する問題がありました。
Mac OS Classic
標準 Perl ディストリビューションの Mac OS Classic での コンパイルは Metrowerks 開発環境があって、 Mac 固有のツールキットがなくても行えるようになりました。 詳細は maclperl メーリングリストに接触してください。
MPE/iX
MPE/iX は Perl 5.6.0 から更新されました。README.mpeix を 参照してください。[561]
NetBSD/threads: GNU pth をインストール(パッケージコレクションからか http://www.gnu.org/software/pth/ )して、 Configure に -Duseithreads を指定してください。 =item *
NetBSD/sparc
Perl は NetBSD/sparc で動作するようになりました。
OS/2
usethreads で動作するようになりました (INSTALL を参照してください)。[561]
Solaris
Sun Workshop コンパイラを使った 64-bit 化が動作するようになりました。
Stratus VOS
ネイティブビルドメソッドでは最低 VOS リリース 14.5.0 と GNU C++/GNU Tools 2.0.1 以降が必要です。 Perl の pack 関数はオーバーフローした値を +infinity に、 アンダーフローした値を -infinity に割り当てるようになりました。
Tru64 (aka Digital UNIX, aka DEC OSF/1)
オペレーティングシステムバージョン文字が $Config{osvers} に 記録されるようになりました。 gcc でコンパイルできるようになりました (以前は明示的に禁止されていました)。 バグったコードが出力されるので gcc でのコンパイルは たとえ gcc 2.95.2 でも未だ薦められません。
Unicos
ビルド時やその後にコアダンプを引き起こしていた さまざまなアライメント問題を修正しました; 実行時の演算エラーで die しなくなりました; 完全な 4 バイト整数 (64 bits) を使うようになりました。 以前は速度のために 46 bit だけを使っていました。
VMS
ここに上げられていない重要な変更については /"Socket Extension Dynamic in VMS" と /"IEEE-format Floating Point Default on OpenVMS Alpha" を参照してください。
chdir() は CRT バグにも関わらずよりよく動作するようになりました; MULTIPLICITY で動作するようになりました(INSTALL を参照してください); Perl の malloc で動作するようになりました。
keys や values による %ENV 要素の汚染は以前は
実装されていませんでした。
現在はドキュメント通りに動作するようになりました。
waitpid エミュレーションが改良されました。
(修正された)最悪のバグは pid に -1 を指定すると
システムの全てのプロセスのワイルドカード検索を引き起こしていたことでした。
POSIX-スタイルのシグナルは VMS バージョン 7.0 以前で はるかによくエミュレートされるようになりました。
system 関数とバッククォート演算子は
機能が改善し、エラー処理もよりよくなりました。[561]
ファイルアクセステストはユーザーのデフォルト権限ではなく 現在のプロセスの権限で行われるようになりました。 これにより、以前は報告されるアクセスと実際のアクセスに 時々不整合が起きていました。 この改良は VMS v6.0 以降でのみ利用可能です。
古い VMS システム (7.0 以前) で kill を単に強制的に終了させるのではなく
シグナルを送ることができるようになる、
sys$sigprc を基とした新しい kill が実装されました。
この実装より、最近のシステムでシグナルハンドラの中で
kill を使えるようにもなりました。
繰り返しされる論理名変換 は SHOW LOGICAL とその他の OpenVMS 機能の 制限により、10 回の変換に制限されるようになりました。
Windows
シグナルの扱いがよりよく動作するようになりました。 Windows のメッセージループを使って実装されたため、 ランダムなクラッシュが発生しにくくなりました。
fork() エミュレーションはより頑強になりましたが、 未だにいくつか難解なバグと欠点があります。 詳細については perlfork を参照してください。[561+]
(擬似)fork に失敗すると、undef を返し、errno に EAGAIN を セットするようになりました。[561]
以下のモジュールが Windows で動作するようになりました。
ExtUtils::Embed [561]
IO::Pipe
IO::Poll
Net::Ping
IO::File::new_tmpfile() はもはやプロセス毎に 32767 回の起動に制限 されなくなりました。
存在しないディレクトリへの chdir() の返り値が改善されました。
64-bit プラットフォーム SDK を使った Perl のコンパイルに 対応しました。
組み込みの Win32::SetChildShowWindow() が、子プロセスによって 作成されたウィンドウの可視性を制御するために利用可能になりました。 詳細については Win32 を参照してください。
子プロセス(または 擬似プロセス)のための非ブロックウェイトが
waitpid($pid, &POSIX::WNOHANG) で対応されました。
system() に複数の引数を与えたときの振る舞いが合理的になりました。
クォートされていない引数は空白を保持するために自動的にクォートされ、
引数内の全ての空白は保存されます。
この改良により、Windows の cmd シェル固有のクォートを
perl プログラムでする必要がなくなるので、
system(@args) の移植性が改善します。
以前のバグっぽい振る舞いに依存したスクリプトがもはや正しく
動作しなくなることに注意してください。
例えば、system("nmake /nologo", @args) は、
ファイル nmake /nologo を実行しようとして、ファイルが見つからないので
失敗します。
一方、perl は system("c:/Program Files/MyApp/foo.exe", @args) といった
コードを正しく実行できるようになります。
perl のヘッダファイルは Microsoft Visual C++ コンパイラからの 共通の警告を抑制しなくなりました。 これにより XS コードをコンパイルするときに追加の警告が 出力されるかもしれません。
Borland C++ v5.5 のコンパイラを使っての Perl のビルドに対応しました。 しかし、作成されたバイナリはその他の対応コンパイラ(GCC と Visual C++)で 作成したものと互換性がありません。[561]
open(F, ">&MYSOCK") でのソケットハンドルの複製が Windows 9x で動作するようになりました。[561]
%ENV のカレントディレクトリのエントリが子プロセスに正しく伝播するように なりました。[561]
新しい %env エントリがサブプロセスに伝播するようになりました。[561]
ドライブのルートでは、Win32::GetCwd() は C: ではなく正しく C:\ を 返すようになりました。chdir() と Cwd::cwd() のその他のバグも 修正されました。[561]
ActiveState ActivePerl (有名な Win32 バイナリディストリビューション) で有効になった機能が makefile でデフォルトになりました。[561]
HTML ファイルは c:\perl\lib\pod\html ではなく c:\perl\html に インストールされるようになりました。
REG_EXPAND_SZ キーが perl で使われるレジストリ設定で有効になりました。[561]
send() が、スレッドの最初ではなく、全てのスレッドから使えるようになりました。
ExtUtils::MakeMaker がライブラリの検索に $ENV{LIB} を使うようになりました。
スレッド毎に確保するスタック量が少なくなったので、 より多くのスレッドを同時に実行できるようになりました。 (未だスレッド当たり 16M です。)[561]
File::Spec->tmpdir() が /tmp ではなく C:/temp を
返すようになりました(perl がサービスとして実行されるときに
よりよく動作します)。
iスレッドでの UNC パスの扱いが改善されました。[561]
wait(), waitpid(), 逆クォートが Windows 9x で正しい終了コードを 返すようになりました。
accept() のソケットハンドルリークが修正されました。[561]
(新しい、もしくは変更された診断メッセージ)
さらなる詳細については perldiag を参照してください。
文字変換演算子での (a-z-9 のような) 不明瞭な範囲指定は 警告を出すようになりました。
chdir("") と chdir(undef) は非推奨の警告を出すようになりました。 ホームディレクトリへの意図的でないディレクトリ変更が 起きることがあるからです。 本当に意味していることをするには chdir() としてください。
2 つの新しいデバッグオプションが追加されました: Perl をデバッグ機能つきでコンパイルした場合、 トークン化をトレースする -DT [561] オプションと 変数を表示するときにリファレンスカウントを表示する -DR オプションが追加されます。
レキシカル警告のカテゴリである "deprecated" はもはや "syntax" カテゴリの サブカテゴリではなくなりました。 トップレベルのカテゴリとなりました。
修飾のない dump() は本当にそれが意味していることなら 明示的に CORE::dump() を使うように提案する警告を出します。
"Unrecognized escape" 警告が \8, \9, \_ を含むように拡張されました。
\w 文字をエスケープする必要はありません。
全ての正規表現コンパイルエラーメッセージは
より理解しやすくなりました。
エラーメッセージは regex に失敗する前に出力されるようになり、
失敗した場所が明確に <-- HERE マーカーで示されるようになりました。
binmode() や close() のようなさまざまな I/O (とソケット) 関数は、 まだオープンされていないか既にクローズされているファイルハンドル (またはソケット)に対して非論理的に使われた場合に、 より一貫した警告を出すようになりました。
ファイルハンドルに対する lstat() は警告を出すようになりました。 (これはしても意味のないことです)。
-M と -m のオプションはモジュール名が指定されなかったときに
警告を出すようになりました。
use に必要最低バージョンを指定した場合、
名前が一致するけれども $VERSION が定義されていないモジュールは
致命的エラーとなります。
左辺値コンテキストで vec() に負数のオフセットを指定することは 警告を発生させます。
overload::constant に半端な数の引数を与えると警告を出すようになりました。
無名ハッシュに半端な数の引数を与えると警告を出すようになりました。
さまざまな "opened only for", "on closed", "never opened" 警告では、
main パッケージ内でファイルハンドルに main:: をつけなくなりました。
例えば main::STDIN ではなく STDIN となります。
サブルーチンのプロトタイプはより慎重にチェックされ、 プロトタイプでない文字を使うなどすると警告が出ます。
(bless されていない)リファレンスを配列のインデックスとして使おうとすると 警告が出ます。
push @a; と unshift @a; (push したり unshift したりする値がない)
は警告が出るようになりました。
これは生成されて eval されたコードで問題になるかもしれません。
perlfunc/pack で、"C" フォーマットに 0 より小さい値や
255 より大きい値を指定しようとするとオプションの警告が出ます。
"c" フォーマットに -128 より小さい値や 127 より大きい値を
指定しようとした場合も同様です。
pack の P フォーマットは明示的なサイズを要求するようになりました。
unpack の w は終端していない圧縮された整数の警告を出すようになりました。
PerlIO の使用に関連する警告が追加されました。
(?o) のようないくつかの正規表現修飾子は、
正規表現全体に適用される場合にのみ意味を持ちます。
そうでない場合、オプションの警告が出ます。
可変長の戻り読み(lookbehind) はまだ実装されていませんので、 これをしようとするとそう知らせます。
配列やハッシュをリファレンスとして使うこと(%foo->{bar})は
しばらくの間非推奨となっています。オプションの警告を出すようになりました。
新しい制限ハッシュ機能に関連する警告が追加されました。
配列とハッシュの自己 tie はサポート外であり、 そうしようとすると致命的エラーとなります。
sort をスカラコンテキストで使うとオプションの警告を出すようになりました。
これは、ソートが行われないので全く使い道がありません。
split() で /g 修飾子を使うのは意味がないので警告が出ます。
splice() を配列の終わりを過ぎて使うと警告が出るようになりました。
不正な Unicode エンコーディング(UTF-8 と UTF-16) は、 (まだ実装されていない) UTF-16 サロゲートを使おうとして 多くの警告を引き起こします。
I/O ストリームでストリームのエンコーディングを (open() か binmode()を使って) 指定せずに Unicode を使おうとすると "Wide character" 警告が出ます。
use/require で v-strings を使うと(過去)互換性警告が出ます。
インタプリタスレッドとその共有データの使用に関連する警告が追加されました。
(内部の変更点)
PerlIO がデフォルトになりました。
perlapi.pod (perlguts の仲間) で内部 API の記述を試みています。
microperl と呼ばれる、本当に最小限の perl をビルドできるようになりました。
microperl のビルドには Configure の実行すら不要です;
make -f Makefile.micro とするだけです。
注意: microperl は多くの仮定を置いています。その中には
大胆すぎるものもあります;結果として実行ファイルがクラッシュしたり、
さもなければ不思議な形で正しくない振る舞いをしたりするかもしれません。
慎重なハッカー専用です。
rsignal(), whichsig(), do_join(), op_clear, op_null, ptr_table_clear(), ptr_table_free(), sv_setref_uv() と、 いくつかの UTF-8 インターフェースが公式 API に追加されました。 利用可能な API の完全な一覧については perlapi を参照してください。
カスタマイズした例外を croak() することで伝播させることが できるようになりました。
xsubs は subs のように属性を持てるようになりました。 (ええ、少なくとも組み込み属性は。)
dTHR と djSP は古いものとなりました; 前者は取り除かれ (なぜならこれは何も行わないからです) 後者は dSP で置き換えられました。
PERL_OBJECT は完全に取り除かれました。
MAGIC 定数 (つまり 'P') はソースコードの可読性と
保守性を高めるためにマクロ化(つまり PERL_MAGIC_TIED)されました。
正規表現コンパイラは
コンパイルされたバイトコードと対応する元の正規表現の文法的要素を
識別するノードの構造を保守するようになりました。
この情報は struct regexp の新しい offsets メンバに
記録されます。
より完全な情報については perldebguts を参照してください。
C コードは遥かによく gcc -Wall クリーンになりました。
プラットフォームによってはいくつかの警告が未だ残っているので、
gcc を使ってコンパイルすることで疑わしい慣習に関する警告を見ることができます。
警告は対応中です。
work on =item *
perly.c, sv.c, sv.h には広範囲にコメントが付けられました。
Perl ソースレポジトリの使い方に関するドキュメントが Porting/repository.pod として追加されました。
プロファイリングのための make ターゲットがいくつか追加されました。
(修正された脆弱性[561])
(これは既に 5.7.0 で修正されていますが、ここで繰り返します。) (5.7.0 は 5.6.1 より先に出ています: 5.7 開発ブランチは 5.6 メンテナンスブランチより先にリリースされています)
オプションである suidperl コンポーネントの潜在的なセキュリティ脆弱性が 2000 年 8 月に発見されました。 suidperl はデフォルトではビルド・インストールされません。 2001 年 11 月までに知られている唯一の脆弱なプラットフォームは Linux で、ほとんど全ての Linux ディストリビューションを含みます。 CERT とさまざまなベンダーとディストリビューターはこの 脆弱性を警告しています。 さらなる情報については http://www.cpan.org/src/5.0/sperl-2000-08-05/sperl-2000-08-05.txt を 参照してください。
問題は Perl が セキュリティ攻撃を報告するために外部プログラムである /bin/mail を使おうとすることです。 Linux プラットフォームでは /bin/main プログラムのドキュメント化されていない 機能が suidperl と結びつくと root シェルへのアクセスを与え、 結果として攻撃を報告する代わりにセキュリティに重大な脅威を与えます。 /bin/mail がないか、'safe setuid scripts' を使っているか、 suidperl がインストールされていなければ、安全です。
攻撃報告機能は Perl 5.8.0 (および 5.6.1 メンテナンスリリースと 全ての Perl 5.7 リリース)では完全に取り除かれましたので、 この脆弱性はもう存在しません。 しかし、残念ながらさらなるセキュリティ脆弱性は常にあり得ます。 suidperl 機能はおそらく Perl 5.10 で取り除かれます。 どちらにしても、suidperl は何が行われ、なぜ sudo ( http://www.courtesan.com/sudo/ を参照してください)のようなその他の ソリューションではなく suidperl を使うのかを完全に理解している セキュリティの専門家だけが使うべきです。
(新しいテスト)
いくつかの新しいテストが追加されました。特に lib と ext サブセクションのためのものです。 現在およそ 69000 個のテスト(700 ほどのテストスクリプトに 拡散しています)と、退行テスト(5.6.1 は 258 テストスクリプトに 11700 テストが あります)があります。 正確な数はプラットフォームと Perl の設定によります。 多くの新しいテストはもちろん新しいモジュールのためのものですが、 一般的な Perl も更なるテストを受けています。
テストの数が多いので、退行テストは予想よりかなり時間がかかります: perl 5.6 の 4-5 倍長い時間がかかります。 本当に速いマシンでのみ(壁時計時間で) 6-8 分で終了する望みがあります。
テストは以前の Perl と違う順番で報告します。 (これは t/lib 以下のテストスクリプトがテストするライブラリ/拡張に より近い位置に移動したからです。)
(既知の問題)
(コンパイラスイートは未だ非常に実験的です)
コンパイラスイートは少しずつ良いものになっていますが、 非常に実験的なままです。製品環境に使うことは薦められません。
(tie された配列やハッシュを local 化すると破壊されます)
local %tied_array;
と書いてもうまく働かず、次のような動作になることでしょう: 古い値が正しく復元されません。 これは将来のリリースでは変更されるでしょうが、我々は現在のところどの新しい セマンティクスが正確であるかを見出していません。どのような場合でも、 変更が現在の(間違った定義の)セマンティクスに依存する既存のコードを 破壊します。よって、通常はとにかくこうなることを回避してください。
mod_perl のような拡張は `largefiles' 問題があるとして知られ、 Perl 5.6.0 から、ファイルオフセットをデフォルト 64 bit 長にする 変更が対応しました。 モジュールが全くコンパイルできなかったり、コンパイルできても 動作しなかったりします。 現在のところ、この問題のよい解決法はありませんが、 Configure は %Config ハッシュに非 largefile 用の ccflags, ldflags, libswanted, libs を提供するようになり (例えば $Config{ccflags_nolargefiles})、問題のある拡張は largefile 化せずに設定しようとすることができます。 これは確かにきれいな解決法ではなく、この解決法が全くうまくいかない 場合もあります。 考えられる失敗の一つは、ファイルオフセットに関して 異なる考えを持つ全てのバイナリを互いにリンクできてしまう (または、リンクできるときにそれがよい考えだと考えてしまう)ことです。
(for(..) 内部での $_ の変更)
for (1..5) { $_++ }
これが警告なしに動作します。そうあるべきではありません。 (ループ中の左辺値要素のみが変更可能であるべきです。) 1..5 を 1, 2, 3, 4, 5 に置き換えると正しい振る舞いを見ることが出来ます。
(mod_perl 1.26 でスレッド化 Perl がビルドできません)
mod_perl 1.27 以降を使ってください。
(lib/ftmp-security テストで 'system possibly insecure' 警告が出ます)
あわてるな。INSTALL の 'make test' の項目を読んでください。
(libwww-perl (LWP) が base/date #51 で失敗します)
libwww-perl 5.65 以降を使ってください。
(PDL でいくつかのテストが失敗します)
PDL 2.3.4 以降を使ってください。
'Undefined symbol "Perl_get_sv"' や "can't resolve symbol 'Perl_get_sv'" と 言ったエラーが出るかもしれません(シンボルは "Perl_sv_2pv" の場合もあります)。 これはおそらく古い Perl の共有ライブラリ(かこれらとリンクされている拡張)を Perl 5.8.0 実行ファイルと共に使おうとしていることを意味しています。 以前の Perl はこのようなサブルーチンを使っていましたが、 現在は使っていません。共有ライブラリパスを調べて、 そのディレクトリにある Perl の共有ライブラリをチェックしてください。
この問題は Perl 5.8.0 のインストールが不完全な場合にも起こります。 この例と、どう扱うかについては /"Mac OS X dyld undefined symbols" を 参照してください。
(自己 tie 問題)
配列とハッシュの自己 tie は深くて修正しにくい部分でおかしくなります。 人々がおかしな結果(最も多いのはコアダンプです)にいらいらするのを 避けるために、これは禁止されることになりました(試みるだけで 致命的エラーになります)。
glob の自己 tie の変更は再帰的リファレンスを引き起こします (参照: perlobj/"Two-Phased Garbage Collection")。 自己 tie された glob を破壊するためには明示的に untie する必要があります。 この振る舞いは将来変更されるかもしれません。
スカラと IO の自己 tie は動作します。
このテストが失敗する場合、libc(C ライブラリ)がスレッドセーフでないことを 示しています。このテストはスレッドセーフかどうかを検出するために localtime() コールにストレステストをかけます。 さらなる情報については perlthrtut を参照してください。
(Thread (5.005-スタイル) テストの失敗)
5.005スタイルでのスレッド操作は非推奨事項になり、 試験的でほとんどサポート外となったと言うことを 覚えておいて下さい。5.10では、削除される予定です。 ithread に移行すべきです。
以下のテストは 5.005 のスレッド操作の実行における根本的な問題の結果失敗する ことがわかっています。これらは新しい失敗事例ではありません--Perl5.005_0x でも 同じバグを持っていたのですが、テストされなかったのです。
../ext/B/t/xref.t 255 65280 14 12 85.71% 3-14
../ext/List/Util/t/first.t 255 65280 7 4 57.14% 2 5-7
../lib/English.t 2 512 54 2 3.70% 2-3
../lib/FileCache.t 5 1 20.00% 5
../lib/Filter/Simple/t/data.t 6 3 50.00% 1-3
../lib/Filter/Simple/t/filter_only. 9 3 33.33% 1-2 5
../lib/Math/BigInt/t/bare_mbf.t 1627 4 0.25% 8 11 1626-1627
../lib/Math/BigInt/t/bigfltpm.t 1629 4 0.25% 10 13 1628-
1629
../lib/Math/BigInt/t/sub_mbf.t 1633 4 0.24% 8 11 1632-1633
../lib/Math/BigInt/t/with_sub.t 1628 4 0.25% 9 12 1627-1628
../lib/Tie/File/t/31_autodefer.t 255 65280 65 32 49.23% 34-65
../lib/autouse.t 10 1 10.00% 4
op/flip.t 15 1 6.67% 15
5.005 スタイルのスレッドは根本的な部分が破綻していると 見なされているため、これらの失敗が修正される見込みは薄いです。 (基本的に起こることとしては、 矛盾したスレッドがグローバルに共有された状態を壊す可能性が あります。一つの良い例としては正規表現エンジンの状態です。)
(タイミングの問題)
以降のテストはタイミングの問題によって断続的に失敗するかも知れません。 例えばシステムに大きな負荷がかかっている時です。
t/op/alarm.t
ext/Time/HiRes/HiRes.t
lib/Benchmark.t
lib/Memoize/t/expmod_t.t
lib/Memoize/t/speed.t
失敗する場合は手作業で起動するようにして下さい。例えば:
./perl -Ilib ext/Time/HiRes/HiRes.t
(tied/magical 配列/ハッシュ要素は自動活性化されません)
普通の配列に対して $foo = \$bar[1] とすると、
(以前に存在していなかったとして) $bar[1] には undef が割り当てられます。
しかし、自動活性化のような tied/magical 配列やハッシュの場合は
このようにはなりません。現在のところリファレンスの作成を捕まえる方法が
ないためです。同じ問題は tied/magical 配列/ハッシュで存在しない
インデックス/キーを切り取る場合にも影響を与えます。
(package/classとサブルーチン名の中でUnicodeは使えません)
識別名をつける際に Unicode を用いることは可能ですが、package/class 又は サブルーチンの名前に関しては不可能です。これに対する制限が存在するのは Perl5.8.0 からですが、意図的と言うよりもむしろ偶発的なものであると言えます; つまり、これまでに述べた目的での Unicode の使用に関してはサポートされません。
この不完全性の理由の一つとしては、本来の移植性(現時点においての)が 無くなってしまうからです: パッケージとサブルーチンの名前はファイルと ディレクトリの名前と対応させる必要があるため、ファイルシステムの Unicode 能力が 重要となります。そして、不幸なことに移植性を重視した答えと言うものは 存在しないのです。
(プラットフォーム固有の問題)
AIX ネイティブの make コマンドを使っている場合、 単に"make"とするのではなく、"make all"としてください。 前者のようにすると、間違って"make install"が実行されることがあります。 あるいは、GNU make を使う方がよいかもしれません。
AIX 4.2 では、statics を使う C++ 関数を使う Perl 拡張は statics が初期化されないために問題が起きるかもしれません。 より新しい AIX では、この問題は Perl に libC_r ライブラリを リンクすることで解決されますが、残念ながら AIX 4.2 では このライブラリは時間に関するさまざまな関数(time() や gettimeofday() など)で 間違った値を返すという不明確なバグがあるため、AIX 4.2 では Perl は libC_r をリンクしていません。
vac 5.0.0.0 May Produce Buggy Code For Perl
AIX C コンパイラ vac バージョン 5.0.0.0 はバグったコードを出力し、 "make test"の一部として実行するといくつかのテストに失敗することが ありますが、失敗したテストを手動で実行すると成功します。 少なくとも vac バージョン 5.0.1.0 にアップグレードすることをお勧めします。 これは Perl を正しくコンパイルできることがわかっています。 "lslpp -L|grep vac.C" とすると vac のバージョンが表示されます。 README.aix を参照してください。
スレッド化 Perl をビルドすると、pp_sys.c でコンパイル警告が 出るかもしれません。
"pp_sys.c", line 4651.39: 1506-280 (W) Function argument assignment between types "unsigned char*" and "const void*" is not allowed.
これは無害です; これは getnetbyaddr() と getnetbyaddr_r() の第一引数の 型が少し違うために発生します。
Linux/alpha か *BSD/Alpha で op/pack, op/pat, op/regexp, ext/Storable の いずれかのテストが失敗した場合、おそらく gcc をアップグレードする タイミングです。2.95.3 以前の gcc は明らかに十分よいものであるとは言えず、 gcc 3.1 はもっとよいものです。(RedHat Linux/alpha で gcc 3.1 の場合は 問題は報告されていませんが、Linux 2.4.18 で gcc 2.95.4 の場合では 報告されています。)(Tru64 では、バンドルされている C コンパイラを使ったほうが よいです。)
Perl 5.8.0 は AmigaOS ではビルドできません。 iスレッドのどこかで問題が発生していて、この問題を解決するための Amiga の専門家が見つけられないのです。 Perl 5.6.1 は未だ Amiga OS で動作します (5.7.2 開発リリースも動作します)。
BeOS Personal 5.03 では Perl 5.8.0 の以下のテストは失敗します。
t/op/lfs............................FAILED at test 17 t/op/magic..........................FAILED at test 24 ext/Fcntl/t/syslfs..................FAILED at test 17 ext/File/Glob/t/basic...............FAILED at test 3 ext/POSIX/t/sigaction...............FAILED at test 13 ext/POSIX/t/waitpid.................FAILED at test 1
さらなる詳細については perlbeos (README.beos) を参照してください。
例えば Cygwin 用の Tk 拡張をビルドするとき、"unable to remap" という エラーが出るかもしれません。 これは Cygwin の既知の問題で、回避方法は以下に詳細があります: http://sources.redhat.com/ml/cygwin/2001-12/msg00894.html
FAT ファイルシステムで NDBM_File をビルドはできますが、 インストール(とテスト)はできません。 NTFS でのインストール(とビルド)はうまくいきます。 FAT でのインストール(とビルド)をテストしようとすると、以下の 失敗が報告されるはずです:
../ext/NDBM_File/ndbm.t 13 3328 71 59 83.10% 1-2 4 16-71 ../ext/ODBM_File/odbm.t 255 65280 ?? ?? % ?? ../lib/AnyDBM_File.t 2 512 12 2 16.67% 1 4 ../lib/Memoize/t/errors.t 0 139 11 5 45.45% 7-11 ../lib/Memoize/t/tie_ndbm.t 13 3328 4 4 100.00% 1-4 run/fresh_perl.t 97 1 1.03% 91
NDBM_File は失敗し、ODBM_File は単にコアダンプします。
t/op/stat............................FAILED at test 29 lib/File/Find/t/find.................FAILED at test 1 lib/File/Find/t/taint................FAILED at test 1 lib/h2xs.............................FAILED at test 15 lib/Pod/t/eol........................FAILED at test 1 lib/Test/Harness/t/strap-analyze.....FAILED at test 8 lib/Test/Harness/t/test-harness......FAILED at test 23 lib/Test/Simple/t/exit...............FAILED at test 1
5.8.0 をロングファイルネーム対応でネイティブにビルドしたときに 上記の失敗が起こることがわかっていますが、dosemu で実行した場合、 dosemu の制限(とおそらくはバグ)によってさらに以下のものが失敗します。
t/comp/cpp...........................FAILED at test 3 t/op/inccode.........................(crash)
さらに lib/ExtUtils test のいくつかと、ロングファイルネーム対応なら 正しく動く Encode/t/Aliases.t の数百のテストが失敗します。 従って、ロングファイルネーム付きでネイティブビルドした方がいいでしょう。
これは FreeBSD 4.5 の readdir_r() に関する既知の問題で、 FreeBSD 4.6 で修正されています (perlfreebsd (README.freebsd) を参照してください)。
ISO 8859-15 ロケールは FreeBSD の locale test 117 で失敗します。 これは 文字 \xFF (文節記号付きの y) と \xBE (文節記号付きの Y) が 大文字小文字を無視してのマッチのときに正しく振舞わないことが原因です。 この問題は最新の FreeBSD リリースでは修正されているようです。 ( http://www.freebsd.org/cgi/query-pr.cgi?pr=34308 )
IRIX で MIPSpro 7.3.1.2m か 7.3.1.3m のコンパイラを使った場合、 List::Util のテストである ext/List/Util/t/shuffle.t が core を出力して 失敗します。gcc でコンパイルした場合は core を出力せず、 その他のプラットフォームでこのように失敗したという話を聞きませんので、 コンパイラのエラーのようです。
同様に、Digest::MD5 拡張をビルドするときに "*** Termination code 139 (bu21)" と表示して失敗することがわかっています。
回避方法は最適化レベルを落とすことです(Configure -Doptimize=-O2)。
perl が -Duse64bitall 付きで設定された場合、lib/posix の subtest 10 の 成功が subtest 9 の成功の前に報告されるため、テストハーネスが 混乱して subtest 9 が失敗したと考えてしまいます。
これは glibc 2.2.5 の long long int の既知のバグです。 ( http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=65612 )
わかっている修正方法はありません。
Mac OS X の壊れたロケールに関する大量の警告を避けるために、 "make test" する前に環境変数 LC_ALL を "C" にセットする (setenv LC_ALL C) ことを忘れないで下さい。
以下のテストは Mac OS X に含まれている Berkeley DB の実装が バグっている(古い)ために失敗することがわかっています。
Failed Test Stat Wstat Total Fail Failed List of Failed ------------------------------------------------------------------------- ../ext/DB_File/t/db-btree.t 0 11 ?? ?? % ?? ../ext/DB_File/t/db-recno.t 149 3 2.01% 61 63 65
UFS パーティションでビルドした場合、多分 t/op/stat.t subtest #9 も 失敗するでしょう。これは Darwin の UPF が inode 変更時刻に 対応していないからです。
また ext/POSIX/t/posix.t subtest #10 が失敗しますが、 これは Perl の責任ではなく Apple の責任(ブロックされたシグナルが 失われる)なので、スキップするようになりました。
iスレッド付きで Configure した場合、ext/threads/t/libc.t が失敗します。 これも Perl の責任ではありません-- Mac OS X の libc はスレッドセーフでは ありません(このテストは localtime() がスレッドセーフかどうかをテストします。)
Perl 5.8.0 をインストールした後、以下のような未定義シンボルの 警告が出る場合:
dyld: perl Undefined symbols
_perl_sv_2pv
_perl_get_sv
おそらく古い Perl 5.8.0 以前のバージョン(あるいはその一部)が /Library/Perl にインストールされています(未定義シンボルは 5.8.0 以前の Perl で使われています)。 なぜか "make install" の時に完全に /Library/Perl 以下のファイルを 上書きできないときがあるようです。古い Perl 共有ライブラリを以下のようにして 外すことが出来ます:
cd /Library/Perl/darwin/CORE
mv libperl.dylib libperlold.dylib
それからもう一度 "make install" してください。 この方法は /usr/local/bin/perl を使っている場合は完全に破壊的であることに 注意してください。 もしこれでもだめなら、/Library/Perl 以下の全ての .bundle ファイルを 削除して、もう一度 "make install" する必要があります。
以下のテストは SUPER-UX で失敗することがわかっています (明確化しておくと、エラーメッセージ全体ではなく失敗することのみを 記しています):
../lib/ExtUtils/t/Mkbootstrap.t 1 256 18 1 5.56% 8 ../lib/ExtUtils/t/Packlist.t 1 256 34 1 2.94% 17 ../lib/ExtUtils/t/basic.t 1 256 17 1 5.88% 14 lib/os2_process.t 2 512 227 2 0.88% 174 209 lib/os2_process_kid.t 227 2 0.88% 174 209 lib/rx_cmprt.t 255 65280 18 3 16.67% 16-18
op/sprintf テスト 91, 129, 130 はプラットフォームによっては 失敗することがわかっています。 例としては、sfio を使うあらゆるプラットフォームおよび、 Compaq/Tandem の NonStop-UX です。
Test 91 は QNX6 (nto) で失敗することがわかっています。
理由は sprintf '%e',0 が 0.000000e+00 ではなく、
誤って 0.000000e+0 を生成するからです。
テスト 129 と 130 について、失敗するプラットフォームは ANSI C 標準 (正確に言うと ANSI X3.159 1989 の 134 ページ の ライン 19ff) に従っていません。 (これは printf フォーマット "%.0f" を使って 0.6 と -0.6 を フォーマットしたときに "1" と "-1" 以外の何かを生成しています; もっとも良くある場合は、"0" と "-0" を生成しています。)
未だに Solaris 2.5(またの名を SunOS 5.5)を使っている場合、 lib/locale.t で(core dump の)テストが失敗するかもしれません。 お勧めの対応策は Solaris をアップグレードすることです。
Perl を 64 bit 整数を使うように設定した場合、 以下のテストが Solaris x86 で失敗することがわかっています:
ext/Data/Dumper/t/dumper.............FAILED at test 268 ext/Devel/Peek/Peek..................FAILED at test 7
以下のテストは SUPER-UX で失敗することがわかっています:
op/64bitint...........................FAILED tests 29-30, 32-33, 35-36 op/arith..............................FAILED tests 128-130 op/pack...............................FAILED tests 25-5625 op/pow................................ op/taint..............................# msgsnd failed ../ext/IO/lib/IO/t/io_poll............FAILED tests 3-4 ../ext/IPC/SysV/ipcsysv...............FAILED tests 2, 5-6 ../ext/IPC/SysV/t/msg.................FAILED tests 2, 4-6 ../ext/Socket/socketpair..............FAILED tests 12 ../lib/IPC/SysV.......................FAILED tests 2, 5-6 ../lib/warnings.......................FAILED tests 115-116, 118-119
op/pack の失敗 ("Cannot compress negative numbers at op/pack.t line 126") は 重大ですがまだ解決していません。 問題いくつかは C コンパイラの符号の扱いによるもので、 64bitint, arith, pow で失敗します。 残りの問題のほとんどは SysV IPC の問題です。
(Term::ReadKey が Win32 で動かない)
Term::ReadKey 2.20 以降を使ってください。
Configure の途中で、以下のテスト:
Guessing which symbols your C compiler and preprocessor define...
が以下のようなメッセージを出して失敗するかもしれません:
CC-20 cc: ERROR File = try.c, Line = 3
The identifier "bad" is undefined.
bad switch yylook 79bad switch yylook 79bad switch yylook 79bad switch yylook 79#ifdef A29K
^
CC-65 cc: ERROR File = try.c, Line = 3
A semicolon is expected at this point.
これは UNICOS/mk の awk ユーティリティのバグによるものです。 このエラーを無視することもできますが、若干の問題があります: C ヘッダを Perl ライブラリに変換する h2ph ユーティリティ (h2ph を参照してください) の 恩恵を完全には受けられないことです。 このツールは主に C プリプロセッサ cpp で使われている定数を Perl からアクセスできるようにするために使われます。 上記のエラーにより、変換されたヘッダの一部が見えなくなります。 幸いなことに、最近は h2ph が必要になることはまれです。
Perl をインタプリタスレッド(iスレッド)付きでビルドした場合、
getgrent(), getgrnam(), and getgrgid() 関数はグループのメンバの リストを返すことができません。 これは UNICOS/mk のマルチスレッド機能のバグによるものです。 つまり、これらの関数はリストコンテキストでは 4 つではなく 3 つしか 値を返さないということです。
いくつかのテストが失敗することがわかっています。 perluts (README.uts)を参照してください。
Perl が VOS Release 14.5.0 と GNU C++/GNU Tools 2.0.1 でネイティブな ビルドプロセスを使ってビルドされた場合、全てのテストは通過するか、 TODO (無視) 失敗の結果となります。
デフォルト設定ではテスト失敗の報告はないはずですが、 更なるデバッグや移殖作業が必要な分野を示すために多くのテストが TODO にマークされています。
マルチ CPU マシンでは、I/O バッファリングに問題があります: 出力が複数出る場合があります。
XML::Parser 2.31 以降を使ってください。
z/OS では多くのテストで失敗しますが、実際のところ状況は 5.6.0 より 大きく改善しています; これは単に多くのモジュールとテストが 追加されたからです。
Failed Test Stat Wstat Total Fail Failed List of Failed
---------------------------------------------------------------------------
../ext/Data/Dumper/t/dumper.t 357 8 2.24% 311 314 325 327
331 333 337 339
../ext/IO/lib/IO/t/io_unix.t 5 4 80.00% 2-5
../ext/Storable/t/downgrade.t 12 3072 169 12 7.10% 14-15 46-47 78-79
110-111 150 161
../lib/ExtUtils/t/Constant.t 121 30976 48 48 100.00% 1-48
../lib/ExtUtils/t/Embed.t 9 9 100.00% 1-9
op/pat.t 922 7 0.76% 665 776 785 832-
834 845
op/sprintf.t 224 3 1.34% 98 100 136
op/tr.t 97 5 5.15% 63 71-74
uni/fold.t 780 6 0.77% 61 169 196 661
710-711
dumper.t と downgrade.t の失敗はテストの中に問題があります。 一方 io_unix と sprintf の失敗は USS (UDP ソケットと printf フォーマット) に 問題があります。 pat, tr, fold の失敗は EBCDIC (pat と fold の場合は EBCDIC と Unicode の 組み合わせ) が原因の、正真正銘の Perl の問題です。 Constant と Embed はおそらくテストの中に問題があります (これは Perl が拡張をビルドできる能力をテストするもので、 十分に正しく動くようにみえるからです)。
(EBCDIC での Unicode 対応はまだむらがあります)
EBCDIC プラットフォームでの Unicode 対応は、ほとんどは動作しますが、
まだ問題点があります。
このような問題点の一つは、コードポイント 256 未満の
\p{} と \P{} 正規表現定数です;
pP は Unicode コードポイントについてテストされ、
EBCDIC については知りません。
(Perl 5.7にはあったが現在無くなってしまったもの)
Time::Pieace(以前はTime::Objectとして知られていました)は
コアモジュールとして十分な価値を持っていると感じられなかったため
削除されました。それでもなお便利なモジュールですので、CPANから入手可能です。
Perl 5.8では、残念ながら今はもうAmigaOSではビルドされていません;開発の 中断はある時偶然にして起こりました。多くのAmigaの開発者が居なくなって以来 我々は5.8.0のための修正やテストが間に合いませんでした。Perl 5.6.1はまだ AmigaOS上で動作します(開発版である5.7.2はリリースされていますが)。
PerlIO::ScalarとPerlIO::Via(大文字が使われている)は5.8.0で
PerlIO::scalarとPerlIO::via(全て小文字)に改名されました。
原則としてコアのIO層は全て小文字の名前です。"プラグイン"では
通常PerlIO::via::QuatedPrintのような名前をつけられます。
threads::shared::queue と threads::shared::semaphore は
5.8.0 の直前に Thread::Queue と Thread::Semaphore に名前が
変わりました。主な理由は、スレッドモジュールを通常の命名法である
Thread::に従わせるためです
(threads と threads::shared はよりプラグマっぽく、コンパイル時に
影響を与えるため、小文字のままです)。
もしバグと思われるものが見つかったら、 comp.lang.perl.misc ニュースグループに 最近投稿された記事や http://bugs.perl.org にある perl バグデータベースを 確認してください。 Perl ホームページ、http://www.perl.com にも情報があります。
もしまだ報告されていないバグだと確信したら、そのリリースに含まれている perlbug プログラムをを実行してください。 バグの再現スクリプトを十分小さく、しかし有効なコードに切りつめることを 意識してください。バグレポートは perl -V の出力と一緒に perlbug@perl.org に送られ Perl porting チームによって解析されます。
Changes ファイルに変更点の完全な詳細があります。
INSTALL ファイルに Perl のビルド方法があります。
README ファイルに一般的なことがあります。
Artistic 及び Copying ファイルに著作権情報があります。
Jarkko Hietaniemi <jhi@iki.fi> によって書かれました。