[pod] [xml]

NAME

perldelta - perl v5.8.0での変更点

DESCRIPTION

このドキュメントは 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 に書いてあります。

Highlights In 5.8.0

(5.8.0 における注目点)

Incompatible Changes

(互換性のない変更)

Binary Incompatibility

(バイナリ非互換)

Perl 5.8 と以前リリースされた Perl のバイナリには互換性がありません。

XS モジュールは再コンパイルしなければいけません。

(ピュア Perl のモジュールは動作するでしょう。)

互換性がなくなった主な理由は PerlIO と呼ぶ新しい IO アーキテクチャのためです。 Perl 5.8 の新しい機能の多くが PerlIO を使用しているので、PerlIO はデフォルトで 組み込まれます。言い換えれば、残念ですが XS のコードを含んでいるモジュールは 再コンパイルしなければなりません。

PerlIO を意識しない XS モジュールは、将来リリースされる Perl で完全にサポート されなくなる可能性があります。しかし PerlIO は stdio インターフェイスを (ソースコードレベルで)差し替えるように設計されているので、モジュール作者へ 過度に負担がかかることはないでしょう。

プラットフォームによってはバイナリの互換性を無くした他の理由があるので 読み進めてください。

64-bit platforms and malloc

(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 Dynaloading

(AIXのダイナミックローディング)

AIX リリース 4.3 またはそれ以降において AIX のダイナミックローディングは 以前のエミュレートされたインターフェースではなく AIX のネイティブ dlopen インターフェースを使うようになりました。この変更はおそらくコンパイルされた モジュールの後方互換性を破壊するでしょう。この変更は、AIX のネイティブ インターフェースを使っている mod_perl のような他のアプリケーションに、 Perl をより従わせるためになされました。

Attributes for my variables now handled at run-time

(実行時にハンドリングする my 変数の属性)

my EXPR : ATTRS 構文は実行時に変数の属性を適用するようになりました。 (サブルーチンおよび our 変数はいまだコンパイル時に属性を適用させます) より詳しくは attributes を参照してください。しかし、これは特にtie インターフェースにとって変数の属性を役立たせます。それは初期のリリースでは 不足していたことです。新しいセマンティクスは Attribute::Handlers モジュール (のバージョン 0.76)では動かないことに注意してください。

Socket Extension Dynamic in VMS

(VMS での動的 Socket 拡張)

Socket 拡張は静的に組み込まれているのではなく動的にロードされるように なりました。これは古い VMS の TCP/IP スタックでは問題になるかもしれませんし ならないかもしれません。 Perl をそのような環境でテストすることができなかったので分からないのです。

IEEE-format Floating Point Default on OpenVMS Alpha

(OpenVMS Alpha での IEEE フォーマットの浮動小数点)

Perl は IEEE フォーマット(T_FLOAT)を OpenVMS Alpha でのデフォルトの内部の 浮動小数点フォーマットとして使うようになりました。これは潜在的に外部 ライブラリや既存データのバイナリ互換性を破壊します。G_FLOAT はいまだ設定の オプションとして利用可能です。VAX (D_FLOAT)でのデフォルトは 変更されていません。

New Unicode Semantics (no more 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 を参照してください。

New Unicode Properties

(新しい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{...} と共に使われる名前に付けるプレフィックス InIs は、ほとんどの場合省略できることになりました。唯一の例外は、 ブロック名がスクリプト名と競合する場合です。その場合には、 Unicode ブロック名にプレフィックス In を付けて区別しなければなりません。 例えば、\p{Tibetan}はスクリプトを参照しますが、 \p{InTibetan}はブロックを参照します。名前の競合がない場合には、 ブロック名のInは省略できます(例:\p{BraillePatterns})が、安全のためには、 いつもInを使うのがたぶん良いでしょう。

REF(...) Instead Of SCALAR(...)

(SCALAR(...)のかわりにREF(...))

リファレンスへのリファレンスは、ref() の返り値をより一貫したものにするために、 "SCALAR(0x81485ec)"のかわりに"REF(0x81485ec)"のように文字列化 されるようになりました。

pack/unpack D/F recycled

(pack/unpack の D/F を再利用)

文書化されていなかった pack/unpack のテンプレートの文字 D/F はよりよい用途の ために再利用されました。現在これらはlong double(もしプラットフォームによって サポートされていれば)と NV (Perl の内部浮動小数点型)を意味します。 (これらは以前は d/f の別名でしたが、皆さんは知らなかったでしょう。)

glob() now returns filenames in alphabetical order

glob() (あるいは<...>)から得られるファイル名のリストは、csh に従って デフォルトでアルファベット順にソートされるようになりました(これは大部分の UNIX プラットフォームで以前に起こったことです)。(bsd_glob() は、 GLOB_ALPHASORT が指定されなければ、いまだプラットフォーム依存で ASCII 順 または EBCDIC 順でソートします。) [561]

Deprecations

(非推奨事項)

Core Enhancements

(コアの拡張)

Unicode Overhaul

(Unicode のオーバーホール)

Unicode は全体的に Perl 5.6.0(あるいは 5.6.1 さえ)よりもさらに使えるように なったはずです。Unicode はハッシュキー中に使われることが可能で、正規表現での Unicode、tr/// での Unicode、I/O での Unicode は動作するようになったはずです。 入門については perluniintro を、詳細については perluniintro を 参照してください。

PerlIO is Now The Default

(PerlIOが標準に)

ithreads

(iスレッド)

Arthur Bergman による、マルチスレッドのための 新しいインタプリタスレッド(略して "iスレッド") 実装が 古い "5.005 スレッド" から置き換えられました。 iスレッドモデルではスレッド間で共有する全てのデータは明示的です。 threads, threads::shared, perlthrtut を参照してください。

iスレッド実装の一部として、Perl は必要で検出可能な 再入可能 libc インターフェースも使用します。

Restricted Hashes

(制限ハッシュ)

制限ハッシュは使用するキーをある集合に制限し、 集合に含まれないキーを追加をすることを防ぎます。 さらにそれぞれのキーに対して削除や値の変更を制限することができます。 Hash::Util モジュールがそのインターフェイスになり、 新しい構文は複雑にはなりません。

Safe Signals

(安全なシグナル)

シグナルが都合の悪い時にやって来ると Perl の内部状態が改変されてしまうと いう点で以前の Perl は壊れやすいものでした。しかし現在の Perl は安全になるまで (between opcodes)シグナルの扱いを引き延ばすようになりました。

この変更は、シグナルが Perl をただちに中断させなくなったため、驚くべき 副作用を持っているかもしれません。現在の Perl は、最初に例えば(sort() のような) 内部操作や(I/O 操作のような)外部操作を 1 つ完了することによって今行っている ことを終わらせ、その後にのみ(そして次の操作を開始する前に)受け取った シグナルを調べます。現在の操作が必ず初めに終わらせられるので内部状態の 改変は無くなりましたが、シグナルが効果を発揮するためにはより多くの時間が かかるかもしれません。しかし potentially blocking operations からの脱出は 今でも働くはずです。

Understanding of Numbers

(数字の解釈)

Perl の数字(整数及び浮動小数点の両方)の解釈の方面に関して全体的に多くの 修正がなされました。多くのシステムにおいて strtoul()atof() のような 数字をパースする標準の関数がバグを抱えているように見えるので、Perl は それらの欠陥に対処するように努めます。 上手くいけば数字がより正確になるでしょう。

Perl は、数の変換や基本計算(+ - * /)において、もし引数が整数ならば内部的に 整数値を使うように努め、さらに、内部的に整数として記憶された結果を 保持するように努めるようになりました。この変更により、わずかに速くなる ことがよく起こり、常により桁落ちの少ない計算方法になります。 (Perl は以前は常に計算時には浮動小数点数を優先していました。)

Arrays now always interpolate into double-quoted strings [561]

(配列は二重引用符で囲まれた文字列において常に展開されるように [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 を参照してください。

Miscellaneous Changes

(その他の変更点)

Modules and Pragmata

(モジュールとプラグマ)

New Modules and Pragmata

(新しいモジュールとプラグマ)

Updated And Improved Modules and Pragmata

(更新または改善されたモジュールとプラグマ)

Utility Changes

(ツールの変更)

New Documentation

(新しいドキュメント)

以下のプラットフォーム固有のドキュメントが利用可能です。 インストール前は 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

Performance Enhancements

(性能の向上)

Installation and Configuration Improvements

(インストールと設定の改善点)

Generic Improvements

(全般的な改善点)

New Or Improved Platforms

(新しい、もしくは改善されたプラットフォーム)

Perl に対応しているとわかっているプラットフォームの一覧については、 perlport/"Supported Platforms" を参照してください。

Selected Bug Fixes

(バグ修正の抜粋)

多くのメモリリークと未初期化メモリへのアクセスが修正されました。 最重要なものとしては、無名 subs がかなりメモリリークしていました。[561]

Platform Specific Changes and Fixes

(プラットフォーム固有の変更と修正点)

New or Changed Diagnostics

(新しい、もしくは変更された診断メッセージ)

さらなる詳細については perldiag を参照してください。

Changed Internals

(内部の変更点)

Security Vulnerability Closed [561]

(修正された脆弱性[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 を使うのかを完全に理解している セキュリティの専門家だけが使うべきです。

New Tests

(新しいテスト)

いくつかの新しいテストが追加されました。特に lib と ext サブセクションのためのものです。 現在およそ 69000 個のテスト(700 ほどのテストスクリプトに 拡散しています)と、退行テスト(5.6.1 は 258 テストスクリプトに 11700 テストが あります)があります。 正確な数はプラットフォームと Perl の設定によります。 多くの新しいテストはもちろん新しいモジュールのためのものですが、 一般的な Perl も更なるテストを受けています。

テストの数が多いので、退行テストは予想よりかなり時間がかかります: perl 5.6 の 4-5 倍長い時間がかかります。 本当に速いマシンでのみ(壁時計時間で) 6-8 分で終了する望みがあります。

テストは以前の Perl と違う順番で報告します。 (これは t/lib 以下のテストスクリプトがテストするライブラリ/拡張に より近い位置に移動したからです。)

Known Problems

(既知の問題)

The Compiler Suite Is Still Very Experimental

(コンパイラスイートは未だ非常に実験的です)

コンパイラスイートは少しずつ良いものになっていますが、 非常に実験的なままです。製品環境に使うことは薦められません。

Localising Tied Arrays and Hashes Is Broken

(tie された配列やハッシュを local 化すると破壊されます)

    local %tied_array;

と書いてもうまく働かず、次のような動作になることでしょう: 古い値が正しく復元されません。 これは将来のリリースでは変更されるでしょうが、我々は現在のところどの新しい セマンティクスが正確であるかを見出していません。どのような場合でも、 変更が現在の(間違った定義の)セマンティクスに依存する既存のコードを 破壊します。よって、通常はとにかくこうなることを回避してください。

Building Extensions Can Fail Because Of Largefiles

mod_perl のような拡張は `largefiles' 問題があるとして知られ、 Perl 5.6.0 から、ファイルオフセットをデフォルト 64 bit 長にする 変更が対応しました。 モジュールが全くコンパイルできなかったり、コンパイルできても 動作しなかったりします。 現在のところ、この問題のよい解決法はありませんが、 Configure は %Config ハッシュに非 largefile 用の ccflags, ldflags, libswanted, libs を提供するようになり (例えば $Config{ccflags_nolargefiles})、問題のある拡張は largefile 化せずに設定しようとすることができます。 これは確かにきれいな解決法ではなく、この解決法が全くうまくいかない 場合もあります。 考えられる失敗の一つは、ファイルオフセットに関して 異なる考えを持つ全てのバイナリを互いにリンクできてしまう (または、リンクできるときにそれがよい考えだと考えてしまう)ことです。

Modifying $_ Inside for(..)

(for(..) 内部での $_ の変更)

   for (1..5) { $_++ }

これが警告なしに動作します。そうあるべきではありません。 (ループ中の左辺値要素のみが変更可能であるべきです。) 1..5 を 1, 2, 3, 4, 5 に置き換えると正しい振る舞いを見ることが出来ます。

mod_perl 1.26 Doesn't Build With Threaded Perl

(mod_perl 1.26 でスレッド化 Perl がビルドできません)

mod_perl 1.27 以降を使ってください。

lib/ftmp-security tests warn 'system possibly insecure'

(lib/ftmp-security テストで 'system possibly insecure' 警告が出ます)

あわてるな。INSTALL の 'make test' の項目を読んでください。

libwww-perl (LWP) fails base/date #51

(libwww-perl (LWP) が base/date #51 で失敗します)

libwww-perl 5.65 以降を使ってください。

PDL failing some tests

(PDL でいくつかのテストが失敗します)

PDL 2.3.4 以降を使ってください。

Perl_get_sv

'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" を 参照してください。

Self-tying Problems

(自己 tie 問題)

配列とハッシュの自己 tie は深くて修正しにくい部分でおかしくなります。 人々がおかしな結果(最も多いのはコアダンプです)にいらいらするのを 避けるために、これは禁止されることになりました(試みるだけで 致命的エラーになります)。

glob の自己 tie の変更は再帰的リファレンスを引き起こします (参照: perlobj/"Two-Phased Garbage Collection")。 自己 tie された glob を破壊するためには明示的に untie する必要があります。 この振る舞いは将来変更されるかもしれません。

スカラと IO の自己 tie は動作します。

ext/threads/t/libc

このテストが失敗する場合、libc(C ライブラリ)がスレッドセーフでないことを 示しています。このテストはスレッドセーフかどうかを検出するために localtime() コールにストレステストをかけます。 さらなる情報については perlthrtut を参照してください。

Failure of Thread (5.005-style) tests

(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 スタイルのスレッドは根本的な部分が破綻していると 見なされているため、これらの失敗が修正される見込みは薄いです。 (基本的に起こることとしては、 矛盾したスレッドがグローバルに共有された状態を壊す可能性が あります。一つの良い例としては正規表現エンジンの状態です。)

Timing problems

(タイミングの問題)

以降のテストはタイミングの問題によって断続的に失敗するかも知れません。 例えばシステムに大きな負荷がかかっている時です。

    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 Array/Hash Elements Do Not Autovivify

(tied/magical 配列/ハッシュ要素は自動活性化されません)

普通の配列に対して $foo = \$bar[1] とすると、 (以前に存在していなかったとして) $bar[1] には undef が割り当てられます。 しかし、自動活性化のような tied/magical 配列やハッシュの場合は このようにはなりません。現在のところリファレンスの作成を捕まえる方法が ないためです。同じ問題は tied/magical 配列/ハッシュで存在しない インデックス/キーを切り取る場合にも影響を与えます。

Unicode in package/class and subroutine names does not work

(package/classとサブルーチン名の中でUnicodeは使えません)

識別名をつける際に Unicode を用いることは可能ですが、package/class 又は サブルーチンの名前に関しては不可能です。これに対する制限が存在するのは Perl5.8.0 からですが、意図的と言うよりもむしろ偶発的なものであると言えます; つまり、これまでに述べた目的での Unicode の使用に関してはサポートされません。

この不完全性の理由の一つとしては、本来の移植性(現時点においての)が 無くなってしまうからです: パッケージとサブルーチンの名前はファイルと ディレクトリの名前と対応させる必要があるため、ファイルシステムの Unicode 能力が 重要となります。そして、不幸なことに移植性を重視した答えと言うものは 存在しないのです。

Platform Specific Problems

(プラットフォーム固有の問題)

AIX

Alpha systems with old gccs fail several tests

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 コンパイラを使ったほうが よいです。)

AmigaOS

Perl 5.8.0 は AmigaOS ではビルドできません。 iスレッドのどこかで問題が発生していて、この問題を解決するための Amiga の専門家が見つけられないのです。 Perl 5.6.1 は未だ Amiga OS で動作します (5.7.2 開発リリースも動作します)。

BeOS

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 "unable to remap"

例えば Cygwin 用の Tk 拡張をビルドするとき、"unable to remap" という エラーが出るかもしれません。 これは Cygwin の既知の問題で、回避方法は以下に詳細があります: http://sources.redhat.com/ml/cygwin/2001-12/msg00894.html

Cygwin ndbm tests fail on FAT

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 は単にコアダンプします。

DJGPP Failures

 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 built with ithreads coredumps reading large directories

これは FreeBSD 4.5 の readdir_r() に関する既知の問題で、 FreeBSD 4.6 で修正されています (perlfreebsd (README.freebsd) を参照してください)。

FreeBSD Failing locale Test 117 For ISO 8859-15 Locales

ISO 8859-15 ロケールは FreeBSD の locale test 117 で失敗します。 これは 文字 \xFF (文節記号付きの y) と \xBE (文節記号付きの Y) が 大文字小文字を無視してのマッチのときに正しく振舞わないことが原因です。 この問題は最新の FreeBSD リリースでは修正されているようです。 ( http://www.freebsd.org/cgi/query-pr.cgi?pr=34308 )

IRIX fails ext/List/Util/t/shuffle.t or Digest::MD5

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)。

HP-UX lib/posix Subtest 9 Fails When LP64-Configured

perl が -Duse64bitall 付きで設定された場合、lib/posix の subtest 10 の 成功が subtest 9 の成功の前に報告されるため、テストハーネスが 混乱して subtest 9 が失敗したと考えてしまいます。

Linux with glibc 2.2.5 fails t/op/int subtest #6 with -Duse64bitint

これは glibc 2.2.5 の long long int の既知のバグです。 ( http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=65612 )

Linux With Sfio Fails op/misc Test 48

わかっている修正方法はありません。

Mac OS X

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() がスレッドセーフかどうかをテストします。)

Mac OS X dyld undefined symbols

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" する必要があります。

OS/2 Test Failures

以下のテストは 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 tests 91, 129, and 130

op/sprintf テスト 91, 129, 130 はプラットフォームによっては 失敗することがわかっています。 例としては、sfio を使うあらゆるプラットフォームおよび、 Compaq/Tandem の NonStop-UX です。

Test 91 は QNX6 (nto) で失敗することがわかっています。 理由は sprintf '%e',00.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

未だに Solaris 2.5(またの名を SunOS 5.5)を使っている場合、 lib/locale.t で(core dump の)テストが失敗するかもしれません。 お勧めの対応策は Solaris をアップグレードすることです。

Solaris x86 Fails Tests With -Duse64bitint

Perl を 64 bit 整数を使うように設定した場合、 以下のテストが Solaris x86 で失敗することがわかっています:

 ext/Data/Dumper/t/dumper.............FAILED at test 268
 ext/Devel/Peek/Peek..................FAILED at test 7

SUPER-UX (NEC SX)

以下のテストは 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 not working on Win32

(Term::ReadKey が Win32 で動かない)

Term::ReadKey 2.20 以降を使ってください。

UNICOS/mk

UTS

いくつかのテストが失敗することがわかっています。 perluts (README.uts)を参照してください。

VOS (Stratus)

Perl が VOS Release 14.5.0 と GNU C++/GNU Tools 2.0.1 でネイティブな ビルドプロセスを使ってビルドされた場合、全てのテストは通過するか、 TODO (無視) 失敗の結果となります。

VMS

デフォルト設定ではテスト失敗の報告はないはずですが、 更なるデバッグや移殖作業が必要な分野を示すために多くのテストが TODO にマークされています。

Win32

マルチ CPU マシンでは、I/O バッファリングに問題があります: 出力が複数出る場合があります。

XML::Parser not working

XML::Parser 2.31 以降を使ってください。

z/OS (OS/390)

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 が拡張をビルドできる能力をテストするもので、 十分に正しく動くようにみえるからです)。

Unicode Support on EBCDIC Still Spotty

(EBCDIC での Unicode 対応はまだむらがあります)

EBCDIC プラットフォームでの Unicode 対応は、ほとんどは動作しますが、 まだ問題点があります。 このような問題点の一つは、コードポイント 256 未満の \p{}\P{} 正規表現定数です; pP は Unicode コードポイントについてテストされ、 EBCDIC については知りません。

Seen In Perl 5.7 But Gone Now

(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::ScalarPerlIO::Via(大文字が使われている)は5.8.0で PerlIO::scalarPerlIO::via(全て小文字)に改名されました。 原則としてコアのIO層は全て小文字の名前です。"プラグイン"では 通常PerlIO::via::QuatedPrintのような名前をつけられます。

threads::shared::queuethreads::shared::semaphore は 5.8.0 の直前に Thread::QueueThread::Semaphore に名前が 変わりました。主な理由は、スレッドモジュールを通常の命名法である Thread::に従わせるためです (threadsthreads::shared はよりプラグマっぽく、コンパイル時に 影響を与えるため、小文字のままです)。

Reporting Bugs

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

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

SEE ALSO

Changes ファイルに変更点の完全な詳細があります。

INSTALL ファイルに Perl のビルド方法があります。

README ファイルに一般的なことがあります。

Artistic 及び Copying ファイルに著作権情報があります。

HISTORY

Jarkko Hietaniemi <jhi@iki.fi> によって書かれました。