perl5101delta - perl v5.10.1 での変更点
このドキュメントは 5.10.0 リリースと 5.10.1 リリースの変更点を記述しています。
もしそれよりも前のリリース、例えば 5.8.8 等からアップデートするのなら、 5.8.8 と 5.10.0 との違いが書かれている perl5100delta を読んでおいた方が よいでしょう。
given
/when
による複雑な式の扱いが拡張されました。 新しく、when
がスマートマッチングの式ではなく真偽値として 引数を解釈する場合が二つあります。
..
と ...
のフリップフロップ演算子は、通常の文法に従ってブール値 コンテキストで評価されるようになりました。 "Range Operators" in perlop を参照してください。
perl 5.10.0 では、when (1..10)
としても、与えられた値が 1 から 10 の間の 数値かどうかをテストするようには動作しないことに注意してください; 代わりに when ([1..10])
を使うべきです (配列リファレンスに 注意してください)。
しかし、5.10.0 とは反対に、when()
でブール値コンテキストで フリップフロップ演算子が評価されることが保証されることで、 特に以下のように双安定条件を実装するときに便利です:
when (/^=begin/ .. /^=end/) {
# do something
}
when (expr1 // expr2)
のような、定義性和 (defined-or) を含む複合式は、 最初の式が真偽値なら真偽値として扱われます。 (これは単に、when (expr1 || expr2)
のような通常の or 演算子に 適用されるすでにあるルールの拡張です。
次の章では、スマートマッチング演算子の文法に関するさらなる変更と、 当然のながら暗黙にスマートマッチングを使っている switch 文の 振る舞いの変更について詳述します。
スマートマッチング演算子 ~~
はもはや可換性を持ちません。 スマートマッチングの振る舞いは、まず右側の引数の型に依存します。 さらに、その文法は一貫性と有用性をより高めるために調整されました。 一般的な後方互換性は維持されている一方、いくつかの変更点には 注意しなければなりません:
空のプロトタイプを持つコードリファレンスは特別扱いされなくなりました。 (たとえ無視されることになるとしても)これらはその他のコードリファレンスと同様に 引数として渡されます。
%hash ~~ sub {}
と @array ~~ sub {}
は、 ハッシュや配列全体をリファレンスとしてサブルーチンに渡すのではなく、 ハッシュのそれぞれのキー(または配列の要素)に対してサブルーチンが 真を返すかどうかをテストするようになりました。
可換性の破綻により、コードリファレンスは ~~
演算子の左側に 現れたときにはもはや特別扱いされず、普通のスカラと同じように扱われます。
undef ~~ %hash
は常に偽となります (なぜなら undef
はハッシュのキーとして 使えないからです)。 (perl 5.10.0 の場合のように)""
への暗黙の変換は行われません。
$scalar ~~ @array
は常に配列の要素に対してスマートマッチングを 分配するようになりました。 これは、もし @array の一つの要素が $scalar ~~ $element
で検証されれば 真となります。 これは、配列にあるスカラが含まれているかどうかをテストする古い振る舞いの 一般化です。
スマートマッチング演算子に関する完全な発行テーブルは "Smart matching in detail" in perlsyn にあります。
一番右の引数の型に依存するという発行ルールによれば、 演算子の右側にオブジェクトのオーバーロード ~~
が現れたとき、 オーバーロードルーチンは(3 番目の引数に真の値を設定して; overload を 参照してください) 常に呼び出されます。 しかし、オブジェクトが左側に現れたとき、オーバーロードルーチンは 一番右の引数が単純なスカラの場合にのみ呼び出されます。 これによって配列に対するスマートマッチングの分配性や 複合型(コードリファレンス、ハッシュ、正規表現)に対するその他の振る舞いは 壊れません。 従って、スマートマッチングのためのローバーロードルーチンの作者は ほとんどの場合、スカラの比較と、可能性があるなら文字列化のオーバーロードに 関してのみ心配する必要があります; その他の一般的な場合は 一貫性を持って自動的に扱われます。
~~
は、オーバーロードしていないオブジェクトに対して動作しなくなりました (オブジェクトの基礎となる構造に依存することを避けるためです)。 しかし、オブジェクトが文字列化か数値化演算子をオーバーロードしていて、 オーバーロードのフォールバックが有効の場合は、通常通りに使われます。)
use feature :5.10*
の文法が少し変更されました。 さらなる情報については "Modules and Pragmata" を参照してください。
オーバーロードが定義されていないオブジェクトに対してスマートマッチング 演算子 ~~
を使うと、実行時エラーが出るようになりました。 (これで、~~
オブジェクトのリファレンスとしての内部表現に マッチングすることでカプセル化を壊すことがなくなります。)
perl インタプリタの開発で使われるバージョン管理システムが Perforce から git に変更されました。 これは主に内部の問題で、perl コアに対して積極的に作業をする 人々にのみ影響があります; しかし、perl -V
の出力の詳細の一部のように、外から見えるところにも 多少の変更があります。 さらなる情報については perlrepository を参照してください。
perl ソースの ext/
ディレクトリの内部構造が再構成されました。 一般的に、今まで ext/Foo/Bar/ にソースが保管されていた Foo::Bar
モジュールは、ext/Foo-Bar/ に置かれるようになりました。 また、いくつかのモジュールが lib/ から ext/ に移動しました。 これは純粋にソース tarball の変更なので、この構造に明示的に 依存していたり、Configure の nonxs_ext
パラメータを ハードコーディングしているような、とてもカスタマイズされたビルド処理を するのでない限り、perl のコンパイルやインストールに違いはないはずです。 特に、この変更によっても最終的にインストールされたファイルの位置は 変更されません。
Test::Harness
2.x から 3.x へのアップグレードへの一部として、 実験的な Test::Harness::Straps
モジュールは取り除かれました。 さらなる詳細については "Updated Modules" を参照してください。
ExtUtils::MakeMaker
のアップグレードの一部として、 ExtUtils::MakeMaker::bytes
と ExtUtils::MakeMaker::vmsish
の モジュールはこの配布から取り除かれました。
Module::CoreList
はもはや %:patchlevel
ハッシュを含まなくなりました。
これは実際には 5.10.0 で導入された変更ですが、5.10.0 の perldelta からは 漏れているので、代わりにここで言及します。
/m
修飾子と qr
の扱いに関するバグ修正の結果、5.8.x と 5.10.0 で 振る舞いが変わっています:
# matches in 5.8.x, doesn't match in 5.10.0
$re = qr/^bar/; "foo\nbar" =~ /$re/m;
Perl 5.10.1 に含まれる Unicode Character Database は 5.0.0 から 5.1.0 に 更新されました。 注目するべき変更点については http://www.unicode.org/versions/Unicode5.1.0/#Notable_Changes を 参照してください。
Perl 5.10.1 から、デフォルト (線形深さ優先検索) 以外のメソッド解決順序を 追加して使うための新しいインターフェースがあります。 5.10.0 で追加された C3 メソッド解決順序は、Perl 空間でのインターフェースの 変更なしにプラグインとして再実装されました。 さらなる情報については perlmroapi を参照してください。
overloading
プラグマこのプラグマは、演算子の一部あるいは全部を、レキシカルに無効化あるいは 有効化します。 (Yuval Kogman)
コア配布は、Unix 風プラットフォームでは退行テストを並列に実行できるように なりました。 make test
を実行する代わりに、環境変数 TEST_JOBS
に並列に 実行するテスト数を設定して、make test_harness
を実行します。 Bourne-風のシェルでは、これは以下のようにします
TEST_JOBS=3 make test_harness # Run 3 tests in parallel
並列 make 自身ではなく、環境変数を使います; なぜなら TAP::Harness はここの競合しないテストスクリプト自身を計画できる必要が ありますが、make
ユーティリティのジョブスケジューラと相互作用するための 標準的なインターフェースはないからです。
いくつかのテストスクリプト(特に ext/IO/t/io_dir.t
)は並列に実行すると 失敗するかもしれないことに注意してください。 もし必要なら、失敗したスクリプトを順番に再実行して、失敗しなくなることを 確認してください。
DTrace へのいくらかの対応が追加されました。 INSTALL の "DTrace support" を参照してください。
configure_requires
への対応CPAN
と CPANPLUS
は、ほとんどの最近の CPAN 配布が含んでいる メタデータファイル META.yml
の configure_requires
キーワードに 対応しました。 これにより、Makefile.PL や Build.PL が実行される前に インストールされていなければならない設定の事前条件を指定できます。
CPAN で配布するときに configure_requires
を指定する方法については ExtUtils::MakeMaker
か Module::Build
の文書を参照してください。
autodie
これは Fatal
モジュール代用品で、新しくレキシカルスコープを持つものです。 同梱されているバージョンは 2.06_01 です。 このリリースでは、autodie
が有効の時に文字列 eval を使うと、 autodie の振る舞いが周りのスコープに漏れるかもしれないことに 注意してください。 さらなる詳細については "BUGS" in autodie を参照してください。
Compress::Raw::Bzip2
これはコアに追加されました (バージョン 2.020)。
parent
このプラグマは、基底クラスとの ISA 関係をコンパイル時に構築します。 これは、機能の不愉快な部分なしに base
の主となる機能を提供します。
Parse::CPAN::Meta
これはコアに追加されました (バージョン 1.39)。
attributes
0.08 から 0.09 に更新されました。
attrs
1.02 から 1.03 に更新されました。
base
2.13 から 2.14 に更新されました。 代用品については parent を参照してください。
bigint
0.22 から 0.23 に更新されました。
bignum
0.22 から 0.23 に更新されました。
bigrat
0.22 から 0.23 に更新されました。
charnames
1.06 から 1.07 に更新されました。
Unicode NameAliases.txt データベースファイルが追加されました。 これにより、以前は認識されなかった追加の \N
文字名(例えば "\N{LATIN CAPITAL LETTER GHA}"
) が追加される効果があります。
constant
1.13 から 1.17 に更新されました。
feature
:5.10
および :5.10.X
で組み込まれる機能が僅かに変更されました。 最後の要素 (つまり X
) がもしあっても、単に無視されます。 これは、一般的にはメンテナンスリリースでは新しい機能はないという仮定に 基づいています。 従って、:5.10
と :5.10.X
は同じ効果を持ちます。 これは 5.10.0 で文書化されている振る舞いへの変更です。
fields
2.13 から 2.14 に更新されました (これは単なるバージョン番号の衝突でした; 機能的な変更はありません)。
lib
0.5565 から 0.62 に更新されました。
open
1.06 から 1.07 に更新されました。
overload
1.06 から 1.07 に更新されました。
overloading
上述の "The overloading
pragma" を参照してください。
version
0.74 から 0.77 に更新されました。
Archive::Extract
0.24 から 0.34 に更新されました。
Archive::Tar
1.38 から 1.52 に更新されました。
Attribute::Handlers
0.79 から 0.85 に更新されました。
AutoLoader
5.63 から 5.68 に更新されました。
AutoSplit
1.05 から 1.06 に更新されました。
B
1.17 から 1.22 に更新されました。
B::Debug
1.05 から 1.11 に更新されました。
B::Deparse
0.83 から 0.89 に更新されました。
B::Lint
1.09 から 1.11 に更新されました。
B::Xref
1.01 から 1.02 に更新されました。
Benchmark
1.10 から 1.11 に更新されました。
Carp
1.08 から 1.11 に更新されました。
CGI
3.29 から 3.43 に更新されました。 (また、3.45 の "default_value for popup_menu()" の修正を含んでいます)。
Compress::Zlib
2.008 から 2.020 に更新されました。
CPAN
1.9205 から 1.9402 に更新されました。 CPAN::FTP
は、ダウンロード失敗時に饒舌すぎるのを止めるローカルな 修正をしています。
CPANPLUS
0.84 から 0.88 に更新されました。
CPANPLUS::Dist::Build
0.06_02 から 0.36 に更新されました。
Cwd
3.25_01 から 3.30 に更新されました。
Data::Dumper
2.121_14 から 2.124 に更新されました。
DB
1.01 から 1.02 に更新されました。
DB_File
1.816_1 から 1.820 に更新されました。
Devel::PPPort
3.13 から 3.19 に更新されました。
Digest::MD5
2.36_01 から 2.39 に更新されました。
Digest::SHA
5.45 から 5.47 に更新されました。
DirHandle
1.01 から 1.03 に更新されました。
Dumpvalue
1.12 から 1.13 に更新されました。
DynaLoader
1.08 から 1.10 に更新されました。
Encode
2.23 から 2.35 に更新されました。
Errno
1.10 から 1.11 に更新されました。
Exporter
5.62 から 5.63 に更新されました。
ExtUtils::CBuilder
0.21 から 0.2602 に更新されました。
ExtUtils::Command
1.13 から 1.16 に更新されました。
ExtUtils::Constant
0.20 から 0.22 に更新されました。 (これらのバージョンは CPAN にはないことに注意してください。)
ExtUtils::Embed
1.27 から 1.28 に更新されました。
ExtUtils::Install
1.44 から 1.54 に更新されました。
ExtUtils::MakeMaker
6.42 から 6.55_02 に更新されました。
ExtUtils::MakeMaker::bytes
と ExtUtils::MakeMaker::vmsish
は この配布から取り除かれたことに注意してください。
ExtUtils::Manifest
1.51_01 から 1.56 に更新されました。
ExtUtils::ParseXS
2.18_02 から 2.2002 に更新されました。
Fatal
1.05 から 2.06_01 に更新されました。 新しいプラグマである autodie
も参照してください。
File::Basename
2.76 から 2.77 に更新されました。
File::Compare
1.1005 から 1.1006 に更新されました。
File::Copy
2.11 から 2.14 に更新されました。
File::Fetch
0.14 から 0.20 に更新されました。
File::Find
1.12 から 1.14 に更新されました。
File::Path
2.04 から 2.07_03 に更新されました。
File::Spec
3.2501 から 3.30 に更新されました。
File::stat
1.00 から 1.01 に更新されました。
File::Temp
0.18 から 0.22 に更新されました。
FileCache
1.07 から 1.08 に更新されました。
FileHandle
2.01 から 2.02 に更新されました。
Filter::Simple
0.82 から 0.84 に更新されました。
Filter::Util::Call
1.07 から 1.08 に更新されました。
FindBin
1.49 から 1.50 に更新されました。
GDBM_File
1.08 から 1.09 に更新されました。
Getopt::Long
2.37 から 2.38 に更新されました。
Hash::Util::FieldHash
1.03 から 1.04 に更新されました。 これはメモリリークを修正しています。
I18N::Collate
1.00 から 1.01 に更新されました。
IO
1.23_01 から 1.25 に更新されました。
これにより、Windows で IO::Socket::INET
の非ブロッキングモードが 動作するようになります [CPAN #43573] 。
IO::Compress::*
2.008 から 2.020 に更新されました。
IO::Dir
1.06 から 1.07 に更新されました。
IO::Handle
1.27 から 1.28 に更新されました。
IO::Socket
1.30_01 から 1.31 に更新されました。
IO::Zlib
1.07 から 1.09 に更新されました。
IPC::Cmd
0.40_1 から 0.46 に更新されました。
IPC::Open3
1.02 から 1.04 に更新されました。
IPC::SysV
1.05 から 2.01 に更新されました。
lib
0.5565 から 0.62 に更新されました。
List::Util
1.19 から 1.21 に更新されました。
Locale::MakeText
1.12 から 1.13 に更新されました。
Log::Message
0.01 から 0.02 に更新されました。
Math::BigFloat
1.59 から 1.60 に更新されました。
Math::BigInt
1.88 から 1.89 に更新されました。
Math::BigInt::FastCalc
0.16 から 0.19 に更新されました。
Math::BigRat
0.21 から 0.22 に更新されました。
Math::Complex
1.37 から 1.56 に更新されました。
Math::Trig
1.04 から 1.20 に更新されました。
Memoize
1.01_02 から 1.01_03 に更新されました (単なる軽微な文書の修正です)。
Module::Build
0.2808_01 から 0.34_02 に更新されました。
Module::CoreList
2.13 から 2.18 に更新されました。 このリリースにはもはや %Module::CoreList::patchlevel
ハッシュは 含まれていません。
Module::Load
0.12 から 0.16 に更新されました。
Module::Load::Conditional
0.22 から 0.30 に更新されました。
Module::Loaded
0.01 から 0.02 に更新されました。
Module::Pluggable
3.6 から 3.9 に更新されました。
NDBM_File
1.07 から 1.08 に更新されました。
Net::Ping
2.33 から 2.36 に更新されました。
NEXT
0.60_01 から 0.64 に更新されました。
Object::Accessor
0.32 から 0.34 に更新されました。
OS2::REXX
1.03 から 1.04 に更新されました。
Package::Constants
0.01 から 0.02 に更新されました。
PerlIO
1.04 から 1.06 に更新されました。
PerlIO::via
0.04 から 0.07 に更新されました。
Pod::Man
2.16 から 2.22 に更新されました。
Pod::Parser
1.35 から 1.37 に更新されました。
Pod::Simple
3.05 から 3.07 に更新されました。
Pod::Text
3.08 から 3.13 に更新されました。
POSIX
1.13 から 1.17 に更新されました。
Safe
2.12 から 2.18 に更新されました。
Scalar::Util
1.19 から 1.21 に更新されました。
SelectSaver
1.01 から 1.02 に更新されました。
SelfLoader
1.11 から 1.17 に更新されました。
Socket
1.80 から 1.82 に更新されました。
Storable
2.18 から 2.20 に更新されました。
Switch
2.13 から 2.14 に更新されました。 "Deprecations" を参照してください。
Symbol
1.06 から 1.07 に更新されました。
Sys::Syslog
0.22 から 0.27 に更新されました。
Term::ANSIColor
1.12 から 2.00 に更新されました。
Term::ReadLine
1.03 から 1.04 に更新されました。
Term::UI
0.18 から 0.20 に更新されました。
Test::Harness
2.64 から 3.17 に更新されました。
Note that 2.x から 3.x へのアップグレードに対する副作用の一つとして、 実験的な Test::Harness::Straps
モジュール (およびそのサポートである Assert
, Iterator
, Point
, Results
モジュール) は 取り除かれました。 もしまだこれらが必要なら、CPAN にある(メンテナンスされていない) Test-Harness-Straps
が利用可能です。
Test::Simple
0.72 から 0.92 に更新されました。
Text::ParseWords
3.26 から 3.27 に更新されました。
Text::Tabs
2007.1117 から 2009.0305 に更新されました。
Text::Wrap
2006.1117 から 2009.0305 に更新されました。
Thread::Queue
2.00 から 2.11 に更新されました。
Thread::Semaphore
2.01 から 2.09 に更新されました。
threads
1.67 から 1.72 に更新されました。
1.14 から 1.29 に更新されました。
Tie::RefHash
1.37 から 1.38 に更新されました。
Tie::StdHandle
これは文書の変更と、初めてバージョン番号 4.2 が割り当てられました。
Time::HiRes
1.9711 から 1.9719 に更新されました。
Time::Local
1.18 から 1.1901 に更新されました。
Time::Piece
1.12 から 1.15 に更新されました。
Unicode::Normalize
1.02 から 1.03 に更新されました。
Unicode::UCD
0.25 から 0.27 に更新されました。
charinfo()
は、最近の Unicode で追加された統合 CJK 符号位置に対しても 動作するようになりました。
古いフィールドは過去互換性のために残されます。 テュルク諸語符号位置固有の情報も返すようになりました。
文書が修正および拡張されました。
UNIVERSAL
1.04 から 1.05 に更新されました。
Win32
0.34 から 0.39 に更新されました。
Win32API::File
0.1001_01 から 0.1101 に更新されました。
XSLoader
0.08 から 0.10 に更新されました。
最近 gcc の検索パスとして追加された、include-fixed
を見るように なりました。
マクロのような enum 値を間違って扱わなくなりました (Daniel Burr)。
enum での C++ 形式の定数 (//
) を扱うようになりました。 (Rainer Weikusat からのパッチを使いました; Daniel Burr からも似たような 修正を提案されました)。
LVALUE
サブルーチンはデバッガからでも動作するようになりました。
デバッガは代理定数サブルーチンとサブルーチンスタブを正しく扱えるように なりました。
Perl 5.10.1 に新しいユーティリティである perlthanks が追加されました; これは perlbug の変種ですが、Perl の作者とメンテナにバグレポートではない ものを送ります。 バグレポートでしかないものを受け取るのは少しがっかりさせるものに なりつつあります: これによって変わるかどうかを見てみます。
これには、Haiku プラットフォームで perl をビルドする方法についての 説明が含まれています。
これは、プラグ可能なメソッド解決順序の新しいインターフェースを 記述しています。
この文書は Richard Foley によるもので、perl プログラムの個々の参照で 使えるパフォーマンスと最適化の技術の使用に関する導入を提供します。
これは、git バージョン管理システムを使って perl のソースに アクセスする方法について記述しています。
これは新しい perlthanks ユーティリティについて記述しています。
(過去 18 年間にわたって perl に対して行われた全ての変更の一覧である) 様々な大きな Changes*
ファイルが取り除かれ、 単に git バージョン制御システムから同じ情報を取り出す方法を説明した 小さいファイル Changes
に置き換えられました。
Porting/patching.pod ファイルは削除されました; これは主に古い Perforce を基としたレポジトリとの相互作用について記述していて、 これは古いものです。 まだ関連のある情報は perlrepository に移動しました。
perlapi, perlintern, perlmodlib, perltoc はリリースの 一部としてではなく、全てビルド時に生成されるようになりました。
新しい内部キャッシュにより、isa()
はしばしばより速くなります。
use locale
の元では、ロケール関係の情報は、keys %hash
で 返されるリストのように、読み込み専用値としてキャッシュされるように なりました。 これによって、use locale
での sort keys %hash
のような操作が とても速くなります。
空の DESTROY
メソッドはもはや呼び出されなくなります。
ext ディレクトリのレイアウトが見直されました。 特に、全てのエクステンションはフラットにトップレベルに置かれ、 パス名中の /
は -
に置き換えられます; 従って、 ext/Data/Dumper/ は ext/Data-Dumper/ のようになります。 エクステンションの名前のうち、Configure で指定されるもの、 dynamic_ext
, known_extensions
, nonxs_ext
, static_ext
で %Config::Config
によって報告されるものは変更なしで、/
を 使い続けます。 従ってこの変更は一旦 perl がインストールされれば何の影響もありません。 しかし、Attribute::Handlers
, Safe
, mro
が新たに独自の権限を持つ エクステンションとなりましたので、もし Configure をビルドする エクステンションの正確なリストを指定するオプション付きで実行する場合、 これらのために変更する必要があるでしょう。
5.10.2 では、多くの 2 重管理されているモジュールが lib から ext に 移動することが計画されています; やはりこれはインストールされた perl には何の変更もありませんが、 もし予め設定されたビルドするエクステンションのリストを使って Configure を起動するときには影響があります。
vendorlib
と vendorarch
が同じなら、@INC
には 1 回だけ 追加されます。
もし perl が -Dusedevel
付きでビルドされたなら、 $Config{usedevel}
と C レベルの PERL_USE_DEVEL
が定義されるように なりました。
Configure は、もしコンパイラが対応しているなら、 スタック破壊攻撃に対する防御のために、-fstack-protector
の使用を 有効にします。
Configure は、もし C コンパイラでなく C++ コンパイラを使うなら、 再入可能な関数と gconvert
のための正しいプロトタイプを 決定するようになりました。
Unix では、もし git レポジトリを含むツリーからビルドするなら、 設定プロセスは perl -v
と perl -V
の出力での表示のために、 チェックアウトしたコミットハッシュを記録します。 プッシュされないローカルのコミットは自動的に perl -V
によって表示されるローカルパッチの一覧に追加されます。
ext のフラット化の一部として、全てのプラットフォームの全ての エクステンションは make_ext.pl でビルドされます。 これは Unix 固有の ext/util/make_ext、VMS 固有の make_ext.com、 Win32 固有の win32/buildext.pl を置き換えます。
AIX 5L と 6.1 のための libbsd が取り除かれました。 flock() だけが libbsd を使っていました。
AIX 5L and 6.1 のための libgdbm が取り除かれました。 libgdbm は AIX Toolbox の追加パッケージとして配布されています。 残念ながら 64 ビット版は壊れています。
AIX 4.2 で再び動作するようにヒントが変更されました。
Cygwin においては、DLL から最後の番号を取り除くことにしました。 これは何年間も cygwin.com のビルドの振る舞いとなっています。 ヒントファイルが更新されました。
ヒントファイルは FreeBSD 7 以降での正しいスレッドライブラリを 識別するようになりました。
Irix 6.5 コンパイラのプリプロセッサにある奇妙なバグを回避するように なりました: cc -E -
は残念ながら K&R モードになりますが、cc -E file.c
では なりません。
Haiku 管理者からのパッチがマージされました。 Perl は Haiku でビルドできるようになったはずです。
Perl は MirOS BSD でビルドできるようになったはずです。
ヒントがバージョン 5.* に対応しました。
Stratus からの様々な変更がマージされました。
Symbian S60 3.2 SDK と S60 5.0 SDK に対応するようになりました。
メッセージウィンドウの扱いが改良され、alarm
と kill
のメッセージが 競合状態でも欠落しなくなりました。
PerlIO::scalar
のメモリ内一時ファイルからの読み込みは、 $/
が(レコード風読み込みを示すために)数値リファレンスにセットされていると 失敗していました。 これは修正されました。
VMS が getgrgid
に対応するようになりました。
VMS ファイル名の扱いと変換に関するコードに対して多くの改良と整理が 行われました。
論理名 PERL_VMS_POSIX_EXIT
を有効にすることで、VMS 条件値を POSIX 返りステータスに変換し、GNV の bash シェルやその他の POSIX 返り値に 依存しているユーティリティとの相互作用を高めます。 詳細については "$?" in perlvms を参照してください。
5.10.0 では不注意によって最適化が無効化されていたため、 例えば @_
から関数の引数への代入でよく使われるような、 リスト代入において目に見えるほどの性能低下を引き起こしていました。 この最適化は再導入され、性能面の退行が修正されました。
while (1) { map 1, 1 }
でのメモリリークが修正されました [RT #53038]。
PerlIO でのコアダンプの可能性が修正されました [RT #57322,54828]。
デバッガは左辺値サブルーチンでも動作するようになりました。
定数が定義されたモジュールでは、デバッガの m
コマンドが壊れていました [RT #61222]。
crypt()
と文字列補完は汚染されていない引数から汚染された値を返すことが ありました [RT #59998].
-i.suffix
コマンドラインオプションは、元のファイルに一致するように モードを変更する前に、制限されたパーミッションを使ってファイルを 再作成します。 これは競合条件の可能性を除去します [RT #60904]。
Unix システムによっては、$?
の値が、子がコアダンプしたときでも 最上位ビット ($? & 128
) がされないことがありました。
状況によっては、$^R が間違って未定義になりました [RT #57042]。
(XS) 様々なハッシュ関数において、キーが UTF-8 の時に予め計算された ハッシュを渡すと、読み出しを間違うことがありました。
(XS) perl.h の前に XSUB.h をインクルードするとコンパイル時エラーが 発生していました [RT #57176]。
$object->isa('Foo')
は、たとえ オブジェクトの @ISA
に Foo
を 含んでいても、パッケージに Foo
が存在していなければ偽を 返すようになりました。
5.10.0 で新規導入された mro コードで、@ISA
を操作することによって 引き起こされる様々なバグが発見され、修正されました。
$x=\$y; $x |= "foo"
のような、リファレンスに対するビット単位演算子が インタプリタをクラッシュさせることがありました [RT #54956]。
代替を含むパターンが内部 UTF-8 表現に敏感になっていました;
my $byte = chr(192);
my $utf8 = chr(192); utf8::upgrade($utf8);
$utf8 =~ /$byte|X}/i; # failed in 5.10.0
UTF8-エンコードされた (つまり use utf8
が有効な) Perl ソースファイル内で、 ダブルクォートされたリテラル文字列が、 could be corrupted where a \xNN
, \0NNN
, \N{}
の後に その値が 255 を超えるリテラル文字が続いている場合に、壊れることがありました [RT #59908]。
B::Deparse
は様々な構造を逆パースするのに失敗していました: readpipe STRING
[RT #62428], CORE::require(STRING)
[RT #62488], sub foo(_)
[RT #62484].
setpgrp()
を引数なしで使うと、perl のスタックが壊れることがありました。
ブロック形式の eval
は特別に Safe
と ops
でトラップ可能に なりました。 以前は間違って文字列の eval
のように扱われていました。
5.10.0 では、2 つの文字 [~
が時々スマートマッチング演算子 (~~
) としてパースされていました [RT #63854]。
5.10.0 では、パターン中の *
量指定子が時々 {0,32767}
として扱われていました[RT #60034, #60464]。 例えば、以下はマッチングに失敗していました:
("ab" x 32768) =~ /^(ab)*$/
shmget
は 64 ビット OS で 32 ビットセグメントサイズに制限されていました [RT #63924]。
given
ブロックから出るために next
や last
を使ったときに、 以下のような誤った警告が出力されなくなりました:
Exiting given via last at foo.pl line 123
Windows では、do
と require
において、'.\foo'
と '..\foo'
が './foo'
と '../foo'
とは異なって扱われていました [RT #63492]。
以下のように、フォーマットからグロブへの代入を行うと、 フォーマットが壊れることがありました:
*bar=*foo{FORMAT}; # foo format now bad
型グロブを文字列や数値に変換しようとすると、アサーション失敗が 発生することがありました。 正しいエラーメッセージである Can't coerce GLOB to $type
が 生成されるようになりました。
use filetest 'access'
中に、-x
は間違ったアクセスモードを 使っていました。 これは修正されました [RT #49003]。
Unicode 値を返す tie されたスカラに対する length
が、初回は 正しく動作していませんでした。 これは修正されました。
配列 tie
の中で配列 tie
を使うと SEGV になることがありました。 これは修正されました。 [RT #51636]
PerlIOStdio_close()
内での競合条件が識別され、修正されました。 これは SEGV を含む、様々なスレッドの問題を引き起こしていました。
unpack
で、スカラコンテキストで ()
グループを使うと、内部的に インタプリタのスタックにリストが置かれ、SEGV を含む様々な現象が 起きていました。 これは修正されました [RT #50256]。
substr
, \&$x
, tie $x, $m
, chop
で、マジックが 2 回 呼び出されていました。 これらは全て修正されました。
5.10.0 での、s///ge
の暗黙のループ中の一時的なスタックをクリアするという 最適化は差し戻されました; これがインタプリタの無関係な部分での 不明瞭なバグの原因となっていたからです [commit ef0d4e17921ee3de]。
elsif
内での警告の行番号が正しくなりました。
..
演算子は、どちらかの端が整数の最小値や最大値に近い値でも 正しく動作するようになりました。
binmode STDIN, ':raw'
は、プラットフォームによってはセグメンテーション フォルトを引き起こすことがありました。 これは修正されました [RT #54828]。
index $str, ...
が実際には index "$str\0", ...
として実行されるという 境界条件のエラーがありました。 これは修正されました [RT #53746]。
正規表現での名前付き捕捉に関連する様々なリークが修正されました [RT #57024]。
ハッシュへの弱いリファレンスがリークを起こすことがありました。 これは DBI
に影響を与えていました [RT #56908]。
正規表現で (?|) を使うとセグメンテンションフォールトを引き起こすことが ありました [RT #59734]。
クロージャ内で UTF-8 の tr//
を使うとセグメンテンションフォールトを 引き起こすことがありました [RT #61520]。
sv_chop()
やその他で SV を昇格させると、SPARC アーキテクチャでは アライメントされていない 64-ビットアクセスをする場合がありました [RT #60574]。
5.10.0 リリースでは、inc_version_list
は間違って 5.8.*
の後に 5.10.*
をリストしていました; これは @INC
の検索順に影響を 与えていました [RT #67628]。
5.10.0 では、pack "a*", $tainted_value
は汚染されていない値を 返していました [RT #52552]。
5.10.0 では、printf
と sprintf
で UTF-8 文字列を表示するときに 致命的エラー panic: utf8_mg_pos_cache_update
が出ることがありました [RT #62666]。
5.10.0 リリースでは、動的に作成した AUTOLOAD
メソッドが失われることが ありました (メソッドキャッシュの問題です) [RT #60220,60232]。
5.10.0 リリースでは、use feature
と //ee
の組み合わせで メモリリークを起こすことがありました [RT #63110]。
shebang (#!
) 行 での -C
は、コマンドラインでも指定されている場合は 再び許可されるようになりました。 shebang 行での -C
は、もし コマンドラインで指定されていなかった 場合には暗黙に no-op となっていました; これは perl 5.10.0 では 不許可となりましたが、これによって動かなくなるスクリプトもありました。 perl はコマンドラインでも指定されているかどうかを調べて、 指定されていないときにだけ die するようになりました [RT #67880]。
5.10.0 で、ある種の再入可能な正規表現によってクラッシュしたり、 以下のアサーション失敗を出力したりすることがありました [RT #60508]:
Assertion rx->sublen >= (s - rx->subbeg) + i failed
panic: sv_chop %s
これは、C ルーチン Perl_sv_chop()
に、スカラの文字列バッファ内でない 位置が渡された時に発生する、新しい致命的エラーです。 これはバグっぽい XS コードによって引き起こされ、この時点では 回復は不可能です。
Can't locate package %s for the parents of %s
この警告は取り除かれました。 一般的に、これは他の警告と同時にのみ生成され、これを取り除くことによって ISA 読み出しの最適化が追加できるようになりました。
v-string in use/require is non-portable
この警告は取り除かれました。
Deep recursion on subroutine "%s"
この警告が出る深さの閾値は、デフォルトでは 100 ですが、C プリプロセッサ マクロ PERL_SUB_DEPTH_WARN
を好みの値に変えて perl バイナリを 再コンパイルすることによって、変更できるようになりました。
C ソースファイルの先頭にある J.R.R. Tolkien の引用文がチェックされ、 適切な言及が追加されました; Tom Christiansen からのパッチに感謝します。
vcroak()
は最初の引数として null も受け付けるようになりました。 さらに、「非 NULL」に関するコンパイラ注釈の完全な監査が行われ、 その他のいくつかの内部関数が修正されました。
errno
変数を一時的に補完することを形式化するための、 dSAVEDERRNO
, dSAVE_ERRNO
, SAVE_ERRNO
, RESTORE_ERRNO
という 新しいマクロが追加されました。
Perl_sv_insert
関数を拡大するために、Perl_sv_insert_flags
関数が 追加されました。
Perl_newSV()
の後 Perl_sv_upgrade(type)
を実行するのと等価な、 Perl_newSV_type(type)
関数が追加されました。
Perl_newSVpvn_flags()
関数が追加されました; これは Perl_newSVpvn()
と 等価で、それからフラグに関連する動作を行います。
現在のところ二つのフラグビットに対応しています。
SVf_UTF8
これはあなたのために SvUTF8_on()
を呼び出します。 (これは ISO 8859-1 文字のシーケンスを UTF-8 に変換しないことに 注意してください。) これのためのラッパである newSVpvn_utf8()
が利用可能です。
SVs_TEMP
新しい SV に対して sv_2mortal()
を呼び出します。
定数文字列を取るラッパである newSVpvs_flags()
もあります。
Perl_croak
へのラッパとして、Perl_croak_xs_usage
関数が追加されました。
PerlIO_find_layer
関数と PerlIO_list_alloc
関数が エクスポートされるようになりました。
PL_na
はコアコードから全て取り除かれ、ローカルな STRLEN テンポラリか *_nolen()
呼び出しに置き換えられました。 どちらの手法も、ithreads ではインタプリタ構造体へ、さもなければ グローバル変数へポインタを守る PL_na
よりも高速です。
Perl_mg_free()
は、スカラでの SvMAGIC() 経由でアクセスできる 開放されたメモリをそのままにしていました。 それぞれのマジックのかけらが開放されるごとに削除されるように、 リンクリストが更新されるようになりました。
ithreads において、PL_reg_curpm
内の正規表現は参照カウントを 行うようにありました。 これにより、参照カウントを行っていないことによる多くのハックっぽい 回避方法が不要になります。
Perl_mg_magical()
は時々間違って SvRMAGICAL()
を作動させていました。 これは修正されました。
IV と NV の public フラグは、もし文字列値の末尾に「ゴミ」が ついている場合はセットされなくなりました。 この振る舞いは、値が型の範囲を超えているときに IV や NV の public フラグがセットされないことと一貫しています。
-Dm
で有効になる診断に、SV 割り当てトレースが追加されました。 トレースは、もし perl バイナリがコンパイルされたときに PERL_MEM_LOG
機構が有効になっていた場合には、これを通しても出力されます。
Nullav
, Nullcv
, Nullhv
, Nullop
, Nullsv
などは、 コアコードおよび 2 重管理されていないモジュールでは NULL
に置き換えられました; NULL
はコアコードに親しんでいなくても より明確だからです。
MUTABLE_PTR(p)
マクロが追加されました; これは (pedantic でない) gcc では const
状態を捨てずに、void *
を返します。 MUTABLE_SV(av)
, MUTABLE_SV(cv)
などのマクロはこれを使って 作成され、const
状態を捨てることなく AV *
などにキャストします。 これにより const
の正当性の適切なコンパイル時の監査が可能になり、 いくつかのエラーの発見に役立ちました(これらは修正されました)。
SV をスタックにプッシュし、それを揮発化させるための、 mPUSHs()
と mXPUSHs()
のマクロが追加されました。
プライベート構造体 mro_meta
の使用が少し変更されました。 どちらにしろ、コアの外側からこれにアクセスすることは出来ません。
新しいツールである Porting/expand-macro.pl
が追加され、 コンパイル時に C プリプロセッサマクロがどのように展開されるかを見られます。 これは perl の内部でマクロを展開しようとする時に便利です。
CPAN から更新された多くのモジュールに新しいテストが組み込まれました。
いくつかのテストは、テストが時間切れになった後に kill することで make test
と make test_harness
が自動的に実行を終了することを 確実にするために組み込まれた「番犬」機能で失敗すると、 ハングアップしてしまう可能性がありました (Jerry Hedden)。
いくつかのコア固有のテストが追加されました:
デバッガが eval
からソース行を得られるかをチェックします。
間違った層が失敗するかをチェックします。
PerlIO 層がリークしていないかをチェックします。
open のある種の特殊な形式が動作するかをチェックします。
PerlIO を全体的にテストします。
内部型 PVBM
と PVGV
の間で想定外の相互作用がないことをチェックします。
エイリアス化されたパッケージが存在したときに MRO が適切に動作するかを チェックします。
dbmopen
と dbmclose
をテストします。
index
とスレッドの相互作用をテストします。
難解なパターンとスレッドの相互作用をテストします。
qr
がリークしていないことをテストします。
regex 再帰とスレッドの相互作用をテストします。
組み込みの qr//
があるパターンとスレッドの相互作用をテストします。
正規表現中の Unicode 特性をテストします。
Unicode 特性とスレッドの相互作用をテストします。
Tie::Hash::NamedCapture
の tie されたメソッドをテストします。
POSIX 文字クラスが一貫性を持って振る舞うかをチェックします。
universal.c のエクスポート可能な re
関数が動作するかをチェックします。
setpgrp
が動作するかをチェックします。
substr
とスレッドの相互作用をテストします。
スカラの昇格と代入が動作するかをチェックします。
文法解析器中の Unicode が動作するかをチェックします。
Unicode と tie
が動作するかをチェックします。
以下はいくつかの重要な未修正のバグの一覧で、5.10.0 か 5.8.x からの 退行です。
List::Util::first
は (典型的には my $_
や given
による) レキシカルな $_
の存在について振る舞いを間違えていました。 each の反復で設定される変数はレキシカルな $_
ではなくパッケージ変数の $_
です [RT #67694]。
同様の問題は、以下のように、最初の引数としてブロックを取る関数を提供している その他のモジュールにも発生するかもしれません。
foo { ... $_ ...} list
charnames
プラグマは、正規表現が変数展開されたときに実行時エラーを 出すことがあります [RT #56444]:
use charnames ':full';
my $r1 = qr/\N{THAI CHARACTER SARA I}/;
"foo" =~ $r1; # okay
"foo" =~ /$r1+/; # runtime error
回避方法は、正規表現の外側で文字を生成することです:
my $a = "\N{THAI CHARACTER SARA I}";
my $r1 = qr/$a/;
正規表現によっては、パターンをコンパイルしたスレッドで実行するのに比べて 子スレッドではとても遅くなることがあります [RT #55600]。
以下のものは非推奨となりました。
Switch
はバグが多いので避けるべきです。 perl 5.11.0 以降、このモジュールのコアバージョンを使うと警告が出力され、 最終的には(おそらく perl 5.14.0 で)コアから取り除かれます。 代替品については "Switch statements" in perlsyn を参照してください。
suidperl
は 5.12.0 で取り除かれます。 これは setuid 許可ビットを正しく扱えないシステムで、これをエミュレートする 機構を提供しています。
このリリースの作業の一部は TRF の助成金を受けています。
Nicholas Clark は 2008 年末をもって公式にメンテナンス pumpking の役目から 引退しました; しかし、実際のところ彼はこの perldelta のかなり部分を 書くことを含む、5.10.1 をリリースできる状態にするために多くの 努力をしています。
特に Steffen Mueller と David Golden は CPAN モジュールを磨き上げて コア内部の等価物と同期させることを助けました。
Craig Berry は、何度私たちが中断させようとしても、飽きることなく VMS で動作するように管理しつつけました。
その他のコアコミッタはほとんどの変更を提供し、AUTHORS に上げられている 数百の貢献者によって送られたパッチのほとんどを適用しました。
(ここで名前を触れなかった全ての人々に陳謝します)。
最後に、Larry Wall に感謝します; 彼がいなければこれら全ては不要でした。
もしバグと思われるものを見つけたら、comp.lang.perl.misc ニュースグループに 最近投稿された記事や http://rt.perl.org/perlbug/ にある perl バグ データベースを確認してください。 Perl ホームページ、http://www.perl.org にも情報があります。
もしまだ報告されていないバグだと確信したら、そのリリースに含まれている perlbug プログラムをを実行してください。 バグの再現スクリプトを十分小さく、しかし有効なコードに切りつめることを 意識してください。バグレポートは perl -V の出力と一緒に perlbug@perl.org に送られ Perl porting チームによって解析されます。
もし報告しようとしているバグがセキュリティに関するもので、公開されている メーリングリストに送るのが不適切なものなら、 perl5-security-report@perl.org に送ってください。 このアドレスは、問題の影響を評価し、解決法を見つけ、Perl が対応している 全てのプラットフォームで問題を軽減または解決するパッチをリリースするのを 助けることが出来る、全てのコアコミッタが参加している非公開の メーリングリストになっています。 このアドレスは、独自に CPAN で配布されているモジュールではなく、 Perl コアのセキュリティ問題だけに使ってください。
Changes ファイルに変更点の完全な詳細を見る方法についての説明があります。
INSTALL ファイルに Perl のビルド方法があります。
README ファイルに一般的なことがあります。
Artistic 及び Copying ファイルに著作権情報があります。