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ファイルを参照して下さい。
重要: デフォルトではあなたが拡張した部分をリコンパイルする
必要はありません。すなわち、このリリースは以前のバージョンとバイナリ互換なの
です。
ファイルハンドルはIO::Handle型として内部的に保存されるようになりました。
use FileHandle
および *STDOUT{FILEHANDLE}は以前のものとの互換性のために
依然サポートされますが、use IO::Handle
および *STDOUT{IO}が将来のやり方です。
新しいOpcodeモジュールは5.003のSafeモジュールを包含しています。
Safeインターフェースは依然有効ですので、現存するスクリプトはまだ動きますが、
利用者の人は頑張って新しいOpcodeの文書を読むようにしてください。
(5.004がインストールされると、もう5.003バイナリのもとでSafeを
走らせたりはできないのだということにも注意を払って下さい 。)
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 = ) =~ /^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 classname, LIST
-
これはクラス用のコンストラクタです。すなわち、
ある種のオブジェクトを戻すことが期待されています。
ある内部情報を保持するために、参照を使用することができます。
sub TIEHANDLE { print "\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 "\n" }
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::Handle
IO::Seekable
IO::File
IO::Pipe
IO::Socket
以上のモジュールについてのさらに詳しい情報は、それぞれの文書を参照して下さい。
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