perldelta - what's new for perl5.004 和訳
Perl初心者の部屋

この文書はcomp.lang.perl.*に投稿された記事をhtml化して翻訳したものです。 誤訳部分のご指摘が頂けるとありがたいです。

From: tchrist@mox.perl.com (Tom Christiansen)
Subject: PREVIEW: The 5.004 Release of Perl
Date: 21 Dec 1996 14:56:02 GMT
Message-ID: <59gtq2$ouk@maureen.teleport.com>

名前

perldelta - perl5.004で何が新しくなったか


記述

Perl5.004 は Unix, Plan9, VMS, OS/2, QNX, 及び AmigaOS上の箱からビルドします。 この文書は(プログラミングPerl第2版 -ラクダ本 [訳注:邦訳は未出版]で記述されている) リリース5.003と5.004の間の相違を記述するものです。


主な変更点

最も重要なことですが、たくさんのバグが対処されました。 詳細は配布キットのChangesファイルを参照して下さい。

重要: デフォルトではあなたが拡張した部分をリコンパイルする 必要はありません。すなわち、このリリースは以前のバージョンとバイナリ互換なの です。

内部の変更:ファイルハンドルの価値が低下(FileHandle Deprecated)

ファイルハンドルはIO::Handle型として内部的に保存されるようになりました。 use FileHandle および *STDOUT{FILEHANDLE}は以前のものとの互換性のために 依然サポートされますが、use IO::Handle および *STDOUT{IO}が将来のやり方です。

内部の変更:SafeモジュールがOpcodeに吸収された

新しいOpcodeモジュールは5.003のSafeモジュールを包含しています。 Safeインターフェースは依然有効ですので、現存するスクリプトはまだ動きますが、 利用者の人は頑張って新しいOpcodeの文書を読むようにしてください。 (5.004がインストールされると、もう5.003バイナリのもとでSafeを 走らせたりはできないのだということにも注意を払って下さい 。)

内部の変更:PerlIO 内部IO抽象インターフェース

stdioの代わりにAT&Tのsfio IOパッケージでPerlをビルドできるように なりました。 詳細はperlapio manページを、また、その使用方法については INSTALLファイルを参照して下さい。

ビルトイン変数の追加と変更

$^E
いくつかのプラットホームでのエラーメッセージが拡張されました。 (use Englishを使った場合 $EXTENDED_OS_ERROR

$^H
現在の構文チェックのセットは use strictで利用可能となっています。 詳細はstrictの文書を参照して下さい。 実際には新しくはないのですが、新たに文書化されました。 Perlコアコンポーネントによる内部使用を意図している為、この変数に対する use English ロングネームは ありません。

$^M
デフォルトでは、メモリを使い果たすのをトラップすることはできません。 しかしながら、もしその為にコンパイルされるのなら、Perlは 緊急用プールとして $^Mの中身を利用することができます。 それはこのメッセージでdie()した後になります。 あなたのPerlが -DEMERGENCY_SBRK でコンパイルされ、perl-mallocを使用して いたと仮定して下さい。その時は、
    $^M = 'a' x (1<<16);

が緊急時使用のために64K バッファをアロケートしてくれるでしょう。 このオプションを可能にする方法についての情報はINSTALLを 参照して下さい。 この進化した機能を不用意に使うことに対する反奨励策として、 この変数に対する
use English ロングネームは ありません。

ビルトイン関数の追加と変更

delete on slices
これはハッシュスライス上で使用される時に行われるようになりました。

flock
はより多くのプラットホームでサポートされるようになり、エミュレートの時は lockfよりもfcntlを好むようになりました。

左辺値としてのkeys
左辺値としてのkeysは、 与えられた連想配列に対してアロケートされたハッシュバケットの数を 増やすことを認めるようになりました。 ハッシュが大きくなっていくことが分かっている場合、これによって効果の測定が 可能になりました。 (これは$#に、より大きな数を代入することで配列を前もって 拡張することと似ています。) 下記のようにした場合、 keys %hash = 200; %hashは自分用にアロケートされた、 少なくとも200バケットを持つようになります。 %hash = (); としても、 これらのバケットは保持されたままとなります。 %hashがまだスコープの中にあるうちに メモリを解放したい場合は、 undef %hashを使って下さい。 このやり方ではkeysを 使ってハッシュ用にアロケートしたバケット数を縮小することは できません。(試してみても影響はありませんから、 たまたまこれを行うからといって心配する必要はありません。)

制御構造の中の my
my()がほとんどあらゆるところで 使えるようになりました。それには下記のような制御構造の中も含まれています。 while (my $line = <>) { $line = lc $line; } continue { print $line; } if ((my $answer = <STDIN>) =~ /^yes$/i) { user_agrees(); } elsif ($answer =~ /^no$/i) { user_disagrees(); } else { chomp $answer; die "'$answer' is neither 'yes' nor 'no'"; } foreach my $i (1, 2, 3) { some_function(); } $iのスコープはループの終わりまで及んでいますが、 それを越えることはありません。

$_やそれに類似したもののような グローバル句読変数に対してmy()を 使用することはまだできないことに注意して下さい。

unpack()pack()
A new format 'w', represents a compressed integer (conforming to the Basic Encoding Rules for ASN.1). Bytes give an unsigned integer base 128, most significant digit first, with as few digits as possible, and with the bit 8 of each byte except the last set to ``1''.
[訳注:この部分は訳出できませんでした。]
新しいフォーマットの'w'は(ASN.1用のBasic Encoding Rulesに準拠した) 圧縮された整数を表します。
バイト群は符号無し整数に与えます。 基数 128です。 最も意味のある桁を最初にします。 できるだけ数桁にまとめます。 最後のバイトを除いて各バイトのビット 8を``1''にセットします。

use Module VERSION LIST
VERSION引数がModuleとLISTの間にある時に、 パッケージモジュール内の$VERSION変数がVERSIONよりも 小さかった場合は、 useは失敗してしまいます。

バージョンの後にコンマがないことに注意して下さい。

prototype(FUNCTION)
は文字列として関数のプロトタイプを戻します。 (関数がプロトタイプを持たない場合はundef。) FUNCTIONは取り出したい関数のプロトタイプへの参照またはその名前です。 (実際には新しくありません。;以前は文書化されていなかっただけです。)

デフォルトとしての $_
ラクダ本で記述された、$_のデフォルトとしての 機能が現実の物となりました。 それが行うことはみんなperlfunc manページに記述されています。

新しいビルトインメソッド

UNIVERSALパッケージは 他の全てのクラスに継承される次のようなメソッドを自動的に含むようになります。:

isa ( CLASS )
isa は、そのオブジェクトがCLASSのサブクラスの中にbless されていた場合、trueを戻します。

また、isa はexport可能であり、 2つの引数とともにサブルーチンとしてコールすることができます。 つまり、参照が指し示しているものが何か調べる能力を得たことになります。 例:

use UNIVERSAL qw(isa); if(isa($ref, 'ARRAY')) { ... }
can ( METHOD )
can は そのオブジェクトがMETHODと呼ばれるメソッドを持っているかどうか 調べます。 持っている場合、そのサブルーチンへの参照が戻されます; 持ってない場合、undefが戻されます。

VERSION ( [ VERSION ] )
VERSIONは、クラス(パッケージ)のVERSION番号を戻します。 引数が与えられると、現在のバージョンが与えられた引数よりも小さくはないか 調べ、その場合はdieします。 このメソッドは通常クラスメソッドとしてコールされます。 また、このメソッドはuse のVERSION形式が使われた時もコールされます。 use A 1.2 qw(some imported subs); A->VERSION( 1.2 ); $ref->is_instance(); # True
注意: can は メソッド検索のためにPerlの内部コードを直接使用します。 また、isa は、 非常によく似たメソッドおよびキャッシングストラテジを使用します。 これは、Perlコードが何かのパッケージ中の @ISAを動的に 変更した場合、奇妙な影響を引き起こすかもしれません。

PerlあるいはXSコードを経由してUNIVERSALクラスに他のメソッドを追加しても 構いません。 自分のプログラムでそのメソッドを有効にするために use UNIVERSALとする必要はありません。 これは、現在のパッケージの中のプレインサブルーチンとして isa を有効にしたい場合のみ 必須となります。

TIEHANDLEがサポートされるようになりました。

TIEHANDLE classname, LIST
これはクラス用のコンストラクタです。すなわち、 ある種のオブジェクトを戻すことが期待されています。 ある内部情報を保持するために、参照を使用することができます。 sub TIEHANDLE { print "<shout>\n"; my $r; bless \$r, shift }
PRINT this, LIST
このメソッドは、tieされたハンドルにprintされる度に誘発(trigger)されます。 その自己参照の次に、それはprint関数に渡されたリストを期待します。

sub PRINT { $r = shift; $$r++; print join($,,map(uc($_),@_)),$\ }

READLINE this
このメソッドはハンドルから読み込まれる時にコールされます。 もうデータがない場合は、メソッドはundef を戻すべきです。 sub READLINE { $r = shift; "PRINT called $$r times\n"; }
DESTROY this
他のタイプのtieと共に、このメソッドはtieされたハンドルがまさにdestroy される時にコールされます。 これはデバッグそしておそらくはクリーンアップにも有用です。 sub DESTROY { print "</shout>\n" }


Pragmata

3つの新しいpragmaticモジュールが存在します:

use blib
dir (あるいは現在のディレクトリ)に始まり、5レベルの'..'まで 遡る、MakeMakerのような'blib'ディレクトリ構造を探します。

アンインストールされたパッケージのバージョンに対する任意のスクリプトを テストする方法として、 -Mオプションを伴ってコマンドライン上で使用されるよう 意図されています。

use locale
このpragmaはビルトイン命令用のPOSIXロケールの使用を可能 (不可能)にするようコンパイラに教えます。 もし、use localeが有効であれば、 現在のLC_CTYPEロケールが正規表現とケースマッピング用に使われます。; 文字列順序づけ用にはLC_COLLATE;POSIX日付フォーマット用にはLC_DATE; そして、printf(), sprintf() 及び write()での 数値フォーマッティング用にはLC_NUMERIC。しかし、print()や 文字列と数値表現のPerl内部における変換には使用されません。 各々の use locale あるいは no localeは、囲まれているBLOCKの終端までの 文(statement)に影響を及ぼします。 ロケールは、POSIX::setlocale()で切り替えたり、問い合わせしたり することが可能です。perl18nを参照してください。

use ops
コンパイル時、unsafeオペレーションを制限します。


モジュール

モジュール情報の要約

新品のモジュール: IO.pm IO::* クラスへの最上位インターフェース IO/File.pm IO::File 拡張Perlモジュール IO/Handle.pm IO::Handle 拡張Perlモジュール IO/Pipe.pm IO::Pipe 拡張Perlモジュール IO/Seekable.pm IO::Seekable 拡張Perlモジュール IO/Select.pm IO::Select 拡張Perlモジュール IO/Socket.pm IO::Socket 拡張Perlモジュール Opcode.pm Perlコードをコンパイルする際named opcodesを無効化 ExtUtils/Embed.pm C プログラムにPerlをembedするためのユーティリティ ExtUtils/testlib.pm just-built拡張を使うために @INCを決める(fix up) Fatal.pm 関数のdo-or-die 同等品を作る FindBin.pm 現在実行しているプログラムのパスを見つける Class/Template.pm 構造/メンバ テンプレートビルダ File/stat.pm CORE::stat 回りのオブジェクト指向wrapper Net/hostent.pm CORE::gethost* 回りのオブジェクト指向wrapper Net/netent.pm CORE::getnet* 回りのオブジェクト指向wrapper Net/protoent.pm CORE::getproto* 回りのオブジェクト指向wrapper Net/servent.pm CORE::getserv* 回りのオブジェクト指向wrapper Time/gmtime.pm CORE::gmtime 回りのオブジェクト指向wrapper Time/localtime.pm CORE::localtime 回りのオブジェクト指向wrapper Time/tm.pm {gm,local}time用"struct tm"のPerl実装 User/grent.pm CORE::getgr* 回りのオブジェクト指向wrapper User/pwent.pm CORE::getpw* 回りのオブジェクト指向wrapper UNIVERSAL.pm *全*クラス用基本クラス

IO

IOモジュールは、一気にIOモジュール全てをロードする簡単なメカニズムを 提供します。 現在これは下記を含んでいます。: IO::Handle IO::Seekable IO::File IO::Pipe IO::Socket 以上のモジュールについてのさらに詳しい情報は、それぞれの文書を参照して下さい。

Math::Complex

Math::Complex モジュールは全面的に書き直しされました。そしてより多くの演算を サポートするようになりました。これらがオーバロードされます。: + - * / ** <=> neg ~ abs sqrt exp log sin cos atan2 "" (stringify) そしてこれらの関数はexportされるようになりました。: pi i Re Im arg log10 logn cbrt root tan cotan asin acos atan acotan sinh cosh tanh cotanh asinh acosh atanh acotanh cplx cplxe

オーバライドされるビルトイン

リストを戻すPerlビルトインの多くがオブジェクト指向のオーバライドを 持つようになりました。それらは以下の通りです。:
[訳注:原文のオーバライドの用法はあっているのかなぁ..] File::stat Net::hostent Net::netent Net::protoent Net::servent Time::gmtime Time::localtime User::grent User::pwent 例えば、以下のように書くことができるようになりました。 use File::stat; use User::pwent; $his = (stat($filename)->st_uid == pwent($whoever)->pw_uid);

効率の拡張

同じ文字列を持つ全てのハッシュキーは一度だけアロケートされます。 同じハッシュのコピーが100 あったとしても、不変キーを再アロケートする必要は 全くないのです。

固定値を戻す以外は何もしない関数がインライン化されました。


文書の変更

ベースおよびライブラリpod文書の多くが改訂されました。 これらの新しいpod文書はセクション1に含まれています。

perli18n
国際化(Internationalization)

perlapio manページ
Perlの内部IOの抽象インターフェース。

perltoot manページ
Perl OO プログラミングのチュートリアル。

perldebug manページ
新しくはありませんが、これは大規模な改訂が行われました。

perlsec manページ
新しくはありませんが、これは大規模な改訂が行われました。


新しい診断

いくつかの新しい条件が、以前は黙っていた警告のきっかけとなる予定です。 いくつかは、あるプラットホームだけに影響します。 次のものが新しい警告とエラーの概略です。

``my'' variable %s masks earlier declaration in same scope (``my''変数%sが同じスコープ内で以前の宣言をマスクする)
(S) 以前のインスタンスへの全てのアクセスを効果的に取り除こうとして、 レキシカル変数が同じスコープ内で再宣言されてしまいました。 これはたいていいつも誤植です。 以前の変数はスコープの終わりまで、あるいはそれへの全てのclosure referents (?)が破壊されるまでずっと存在するということに注意して下さい。

Allocation too large: %lx
(X) MSDOS 機では64K 以上はアロケートできません。

Allocation too large
(F) 2^31+``small amount''バイト以上はアロケートできません。

Attempt to free non-existent shared string  (存在しない共有文字列をfreeしようとした)
(P) Perlは ストレージおよびハッシュキーと他の文字列のアクセスを最適化するために、 文字列の内部テーブルをカウントする参照を保持しています。 これは、もうそのテーブルの中では見つけられない文字列の参照カウントを 誰かが減少しようとしたことを示しています。

Attempt to use reference as lvalue in substr
(W) 左辺値として使用されているsubstr()の最初の引数として、 ある参照を与えましたが、それがひどくおかしいのです。 おそらく、最初にそれをdereferenceするのを忘れているのでしょう。 substrを参照して下さい。

Unsupported function fork
(F) 実行可能形式のバージョンがforkをサポートしていないのです。 OS/2のように、いくつかのシステムのもとでは異なった風味のPerl実行可能形式が あり、そのうちの幾つかはforkをサポートしていて、幾つかはしていません。 Perlをcallする名前をperl_perl__等に変更して みてはどうでしょう。

Ill-formed logical name |%s| in prime_env_iter
(W) VMS 特有の警告。 論理名を管理している構文ルールに違反する%ENVを繰り返す 用意している時、論理名が出会しました。 通常は変換され得ないので、スキップされ、%ENVの中には 現れません。 A warning peculiar to VMS. A logical name was encountered when preparing to iterate over %ENV which violates the syntactic rules governing logical names. Since it cannot be translated normally, it is skipped, and will not appear in %ENV. This may be a benign occurrence, as some software packages might directly modify logical name tables and introduce non-standard names, or it may indicate that a logical name table has been corrupted.

Integer overflow in hex number
(S) あなたが指定したリテラルの16進数は あなたのアーキテクチャには大きすぎます。 32ビットアーキテクチャでは最大16進リテラルは0xFFFFFFFFです。

Integer overflow in octal number
(S) あなたが指定したリテラルの8進数は あなたのアーキテクチャには大きすぎます。 32ビットアーキテクチャでは最大の8進リテラルは037777777777です。

Null picture in formline
(F) フォームラインへの最初の引数は有効なフォーマットのpicture 仕様でなければなりません。 空で見つけられたということは、たぶん初期化していない値をそれに供給した ことを意味しています。 perlform man ページを参照して下さい。

Offset outside string
(F) バッファの外を指し示すオフセットを使ってread/write/send/recv オペレーションをしようとしました。 想像しがたいことです。 この唯一の例外はバッファを通り過ぎてsysread() することが バッファを拡張し、新領域をゼロでパディング(埋めること)することです。

Out of memory!
(X|F) malloc()関数は0 を戻し、 リクエストを満足するだけの十分な残メモリ(あるいは仮想メモリ)がないことを 示しています。

リクエストが小さいと判断された場合、それをトラップできるかどうかは Perlがコンパイルされた方法によって決まります。 デフォルトではトラップはできません。 しかしながら、このためにコンパイルされた場合、 このメッセージと一緒にdieした後、Perlは緊急プールとして $^Mの中身を 使用することができます。 その場合、このエラーは一度だけトラップする事ができます。

Out of memory during request for %s
(F) malloc()関数は0 を戻し、 リクエストを満足するだけの十分な残メモリ(あるいは仮想メモリ)がないことを 示しています。 しかしながら、要求が十分大きい(コンパイル時のデフォルトは64K です)と 判断された場合、このエラーをトラップすることによってシャットダウンする 可能性を与えられるようになります。

Possible attempt to put comments in qw() list qw()リストにコメントを入れようとした可能性がある)
(W) あなたはたぶん下記のように書いたのでしょう。: qw( a # コメント b # もう一つのコメント ) ; 本来このように書くべきでした。: qw( a b ) ;
Possible attempt to separate words with commas (語をコンマで分割しようとした可能性がある)
(W) あなたはたぶん下記のように書いたのでしょう。: qw( a, b, c ); 本来このように書くべきでした。: qw( a b c );
untie attempted while %d inner references still exist (内部参照がまだ存在するのにuntieが試みられた)
(W) untieがコールされた時、 tie (あるいは tied)から戻ったオブジェクトのコピーが まだ有効だった。

Got an error from DosAllocMem: (DosAllocMem:からエラーを受け取った)
(P) OS/2に特有のエラー。大半はたぶんPerlの廃れたバージョンを 使用しているためで、とにかく発生すべきものではありません。

Malformed PERLLIB_PREFIX (奇形のPERLLIB_PREFIX)
(F) OS/2に特有のエラー。PERLLIB_PREFIXは書式にあっているべきです。 prefix1;prefix2 あるいは prefix1 prefix2 prefix1とprefix2は空であってはいけません。 prefix1が本当にビルトインライブラリ検索パスのprefix(接頭辞?) である場合、prefix2が代わりとなります。 エラーはコンポーネントが見つからなかったり、あるいは長すぎたりした場合現れる ようです。 ``PERLLIB_PREFIX''を参照してください。

PERL_SH_DIR too long (PERL_SH_DIRが長すぎる)
(F) OS/2特有のエラー。PERL_SH_DIRはsh-shell inを見つけるための ディレクトリです。``PERL_SH_DIR''を参照。

Process terminated by SIG%s
(W) これはOS/2アプリケーションから発行される標準メッセージです。 一方、*nixアプリケーションは沈黙のうちに死んでいきます。 それはOS/2ポート(移植)の特徴と考えれています。 適切なシグナルハンドラによって簡単にこれが発生しないように出来ます。 ``Signals''を参照して下さい。 ``Process terminated by SIGTERM/SIGINT''を参照して下さい。


バグ

あなたがバグと思うものを見つけた場合、最近comp.lang.perl.miscニュースグループに 投稿された記事のヘッダを確認しましょう。 また、Perlホームページの http://www.perl.com/perl/に 情報があるかもしれません。

報告されていないバグであると信じたなら、そのリリースに含まれている perlbugプログラムを実行してみて下さい。 小さいが十分なテストケースまでバグを刈り込んでいることを確かめて下さい。 Perlポーティングチームによる解析のために、 perl -Vの出力に加えて、あなたのバグ報告が perlbug@perl.comへと発送されます。


参照

変更点を網羅した詳細な Changes ファイル。

Perlのビルド方法用INSTALLファイル。このファイルは5.004用に大きく 更新されましたので、熟練した利用者も通読するようにしてください。

一般的な事項用READMEファイル。

著作権情報用Copying ファイル。


履歴

数え切れない寄稿者から資料をつかみ取り、数名以上のPerlポータから いろいろ助言をもらいながら、Tom Christiansenが構成しました。

最終更新: Tue Dec 17 15:49:40 WET 1996

-- Tom Christiansen tchrist@alumni.cs.colorado.edu

"AT&T -- anything better is illegal." -- Keith Lofstrom, comp.unix.bsd, "AT&T sues BSDI" thread