読者です 読者をやめる 読者になる 読者になる

defined @_の挙動

perl

http://memo.freedom-lite.com/?p=991


を見ていて、最後の例の挙動が違うなぁって思ったんですが、
これは 5.14で defined @_の挙動が変わっていることが原因でした。

% perlbrew exec perl -e 'sub {print "defined\n" if defined @_}->()'
perl-5.10.1
==========
defined


perl-5.12.3
==========
defined


perl-5.14.1
==========


perl-5.8.9
==========
defined

5.14以前だと引数がない場合でも, defined @_が真となります。
引数ありだと全部 definedとなります。

% perlbrew exec perl -e 'sub {print "defined\n" if defined @_}->(10)'
perl-5.10.1
==========
defined


perl-5.12.3
==========
defined


perl-5.14.1
==========
defined


perl-5.8.9
==========
defined

@_には definedを適用しない方がいいでしょう。引数が設定されているか
どうかを確認したいのであれば、以下のように配列長が 0かどうかを確認するのが
よいでしょう。丁寧に書くなら "scalar @_ > 0"となるでしょうか。

% perlbrew exec perl -e 'sub {print "defined\n" if @_}->()'
perl-5.10.1
==========


perl-5.12.3
==========


perl-5.14.1
==========


perl-5.8.9
==========

追記(2011/AUG/10)

perldoc -f definedで見ると、deprecateなんで使うなということになっていました。