如何在Perl中处理不同的布尔值?

时间:2019-06-27 01:05:46

标签: perl

我有一个现有函数,该函数检查是否定义了输入变量,如果等于另一个变量,则返回true,否则返回false:

sub isVar1Valid {
    my ($self, $var1) = @_;
    my $var2 = "someValue";   
    return $var1 && $var1 eq $var2;
}

我正在为此功能编写单元测试,并且我正在寻找的预期输出为false。在单元测试中,我实际上是在测试0。但是,我的测试失败了,因为上述方法返回了' ',并且不等于0

我的单元测试看起来像

my $actualOutput = isVar1Valid($input);
is($actualOutput, 0);

我应该在单元测试中测试' '作为预期输出吗?还是应该在我的主函数中返回0

这是我第一次与Perl合作,因此感谢您提供任何指导。

1 个答案:

答案 0 :(得分:4)

如果$var1为假,则该子项将返回$var1的值。

如果$var1为真,但与$var2不同,则子程序将返回一个标量,该标量包含整数0,浮点数0和空字符串

但是我不会明确检查任何这些值。它们都是合法值,检查每个值都太复杂了。

相反,您应该进行标准化。

is(isVar1Valid($input) ? 1 : 0, 0);

更好的是,使用ok代替is

ok(!isVar1Valid($input));

顺便说一下,请注意以下构造有点奇怪:

$var1 && $var1 eq $var2

第一次检查的目的可能是避免“未初始化”的警告。如果是这样,最好通过使用以下内容将其传达给读者:

defined($var1) && $var1 eq $var2

这很重要,因为如果$var2为假,则第二个版本不等于第二个版本。