今日出会った 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 に対してリファレンスを参照するということも知らなかった。