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が返ってくるみたいです。