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コアのバグであるようだ*1perlPerl_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

*1:5.6.2, 5.8.1, 5.10.1および少し前のbleadperlなどで落ちることを確認した。必ずしもSEGVするとは限らないが,いずれのperlでも異常終了は起きる

*2:たとえばモジュールが存在しない,など