何时使用已定义

oct*_*bus 3 perl

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

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)

ike*_*ami 9

$sth->fetchrow_hashref将返回undef或引用哈希.因此

if (defined($row))
Run Code Online (Sandbox Code Playgroud)

和

if ($row)
Run Code Online (Sandbox Code Playgroud)

在这里等同.(undef是假的,引用总是正确的.)我选择更简单的替代方案.

同样的想法$dbh->prepare.


Ror*_*ter 5

在您发布的代码的情况下,我也会像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)