Perl 5.11.1 features
perl-5.11.0の続報。
perl-5.11.1がリリースされた。
例によって個人的に興味をもったトピックを紹介するが,今回は大きな変更はない。
- Add
package NAME VERSION
syntax- use NAME VERSION と同じように解釈されるようだ
- アンダースコア付きの開発版でもクォートする必要はなくなる
- deprecated warningsがデフォルト*1で有効になった
- no warnings 'deprecated' で抑えることは可能
- もともと -w 付きで実行しているスクリプトにとっては関係ない
package NAME VERSION構文はモジュール作者としては少しうれしいが,非互換の変更であるわりにはユーザーにとってのメリットが皆無なのは悲しい。
See also perl5111delta
*1:-w/use warnings を指定しない状態
eval "use $module" in Perl_call_sv() could segmentation faults
Data::Utilのmethod modifiersが落ちる件は,Perlコアのバグであるようだ*1。perlがPerl_call_sv()でサブルーチンを呼び出すときに,そのサブルーチンがディレクティブを含んだeval()を実行し,そのuseディレクティブが例外を放出すると*2,setjmp(3)がSEGVを起こしたり黙って落ちたりするようだ。
この問題はPerl_call_sv()を使っているXSコードで起きやすいが,以下のコードで示すようにPure Perlでも発現する可能性がある。
再現コード:
#!perl -w use strict; use Test::More tests => 3; { package T; use Tie::Hash(); use base qw(Tie::StdHash); sub FETCH{ my($self, $key) = @_; # XXX: "require $key" is okey eval "use $key(); 1"; } } tie my(%t), 'T'; ok $t{Cwd}, 'existing module'; ok!$t{'No::Such::Module'}, 'non-existing module'; ok $t{strict}, 'existing module'; __END__
この件はperlbug(1)で報告した:
http://rt.perl.org/rt3/Public/Bug/Display.html?id=69939