北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

ハッシュの判定は裸で

ラクダ本によると、%hogeに値があるかの判定は、

do_something() if defined %hoge;

ではなく、

do_something() if %hoge;

がいいっぽいです。お試しコード。

use strict;
my %hoge = ();

print "before\n";
printf("disp    : %s\n", scalar(%hoge));
printf("defined?: %s\n", defined %hoge ? 'True' : 'False');
printf("true?   : %s\n", %hoge ? 'True' : 'False');

$hoge{abc} = 'def';

print "after set\n";
printf("disp    : %s\n", scalar(%hoge));
printf("defined?: %s\n", defined %hoge ? 'True' : 'False');
printf("true?   : %s\n", %hoge ? 'True' : 'False');

delete $hoge{abc};

print "after delete\n";
printf("disp    : %s\n", scalar(%hoge));
printf("defined?: %s\n", defined %hoge ? 'True' : 'False');
printf("true?   : %s\n", %hoge ? 'True' : 'False');

結果。

before
disp    : 0
defined?: False
true?   : False
after set
disp    : 1/8
defined?: True
true?   : True
after delete
disp    : 0
defined?: True
true?   : False

確かに、definedで評価すると戻りが不自然です。一度でも利用されると、trueが返ってくるみたいです。