3

我对测试参数的方式有点困惑。这是下面发布的源代码中的两个示例。首先是这个

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;
}
4

3 回答 3

9

$sth->fetchrow_hashref将返回undef或引用哈希。像这样

if (defined($row))

if ($row)

在这里是等价的。(undef是错误的,参考总是正确的。)我选择更简单的替代方案。

相同的想法$dbh->prepare

于 2013-10-15T17:55:18.320 回答
5

对于您发布的代码,我也会按照 ikegami 所说的那样做,并使用较短的形式。

但是,在某些情况下这并不合适,例如,如果变量可能具有合法值,如果仅在真/假测试中使用该值将被视为假。例如:

my $value = 0;
print "defined\n" if defined $value;  # prints 'defined'
print "true\n" if $value;  # does not print anything
于 2013-10-15T18:29:53.973 回答
1

好吧,在 perl 脚本语言中,defined($a)只是一个测试 $a 是否为 "undef" 的子例程,仅此而已。那么,你会问,undef是什么?

准确地说,它是一个perl子程序,和定义的一样。但是当它没有参数时,它可以被认为是一个perl-special scalar。例如,当你从一个空数组中弹出一个值时,它会返回一个undef。当你调用子程序“undef $b”时,那么 $b 将变为 undef($b 必须是一个左值),没有别的。仅在这种情况下,defined($b) 将返回 false。但如果 $c 是空字符串,如 "" 、数字零或字符串 "0" ,defined($c) 仍将返回 true;

但是如果你使用一个简单的布尔表达式而不是定义的,它就变得完全不同了。一个简单的布尔测试不会区分 undef、零、空字符串和 "0"。因此,在确定使用 defined() 或仅使用布尔测试时,这绝对取决于您的实际要求。

于 2013-10-18T07:46:35.050 回答