我对测试参数的方式感到有点困惑.以下是从下面发布的源代码中的两个示例.首先是这个
if(!defined($DBHdl) || !defined($acct_no));
测试未定义参数的方法?
其次,在分配hashref之后
$ptMtrRecRef = $ptSelHdl->fetchrow_hashref;
是测试$ptMtrRecRef被定义使用的最佳方式
if(!$ptMtrRecRef)
要么
if(!defined($ptMtrRecRef))?
###############################################################################
# Returns count of meters per account number.
# $PkNam -- package name discarded
# $DBHdl -- ICS database handle
# $acct_no -- water account number
sub mgbl_get_meter_count
{
my ($PkNam, $DBHdl, $acct_no) = @_;
die("mgbl_get_meter_count passed undef handles.\n")
if(!defined($DBHdl) || !defined($acct_no));
my $ptSelHdl;
my $ptMtrRecRef;
my $sql_statement =
"select count(*) from meter m where m.acct_no = ".$acct_no.";";
$ptSelHdl = $DBHdl->prepare($sql_statement);
die("Cannot prepare select count(*) from meter m\n")
if(!$ptSelHdl || !$ptSelHdl->execute);
$ptMtrRecRef = $ptSelHdl->fetchrow_hashref;
return $ptMtrRecRef;
}
Run Code Online (Sandbox Code Playgroud)
$sth->fetchrow_hashref将返回undef或引用哈希.因此
if (defined($row))
Run Code Online (Sandbox Code Playgroud)
和
if ($row)
Run Code Online (Sandbox Code Playgroud)
在这里等同.(undef是假的,引用总是正确的.)我选择更简单的替代方案.
同样的想法$dbh->prepare.
在您发布的代码的情况下,我也会像ikegami所说的那样,并使用较短的形式.
但是,有时这种情况并不合适,例如,如果变量可能具有合法值,如果仅用于真/假测试,则该值将被视为false.例如:
my $value = 0;
print "defined\n" if defined $value; # prints 'defined'
print "true\n" if $value; # does not print anything
Run Code Online (Sandbox Code Playgroud)