今日出会った 5.8 系と 5.10.0 の違い
use strict; my $subclass = 'Test'; print 'hard ref : ' . (eval { defined ${"${subclass}::"}; 1 } ? 1 : 0), "\n"; sub foo { print 'foo' } print 'check &foo : ' . (defined &foo ? 1 : 0), "\n";
5.8.8
hard ref : 1 check &foo : 1
5.10.0
hard ref : 0 check &foo : 1
perldelta - perl 5.10.0 の新機能
http://fleur.hio.jp/perldoc/mix/pod/perl5100delta.ja.html
use strict 'refs' は次のような defined() の引数でのハードリファレンスを無視していました:
これは適切に実行時エラー Can't use string as a SCALAR ref while "strict refs" in use ("struct refs" の影響下では文字列を SCALAR リファレンスとして使うことは出来ません)を生成するようになります.
ということらしい。
そもそも defined が &foo に対してリファレンスを参照するということも知らなかった。