当数字比较为假时,Perl会返回什么?

时间:2014-11-12 17:30:45

标签: perl

我正在尝试执行此代码。令我困惑的是为什么这个比较在错误时不会返回任何值。这是这些比较运算符的默认行为吗?

my $output = (2 <= 1); 
print "value=$output";

当逻辑检查失败时,比较运算符会返回undef吗?

4 个答案:

答案 0 :(得分:13)

relational operators

  

返回1表示true和特定版本的已定义空字符串,&#34;&#34; ,它被视为零,但不受有关不正确的数字转换的警告,就像&#34; 0但是真的&#34;是

你得到的价值实际上是双变量。它有单独的数字和字符串值(实际上不是空字符串的特殊版本)。数值为0,字符串值为空字符串。你使用了字符串部分,它是空的,但0仍然存在。您可以使用Devel::Peek

查看变量记录
use Devel::Peek;
my $result = ( 1 == 2 );
Dump( $result );

在幕后的SV(标量值)事物中,您会看到PV中的字符串值和IV和NV中的数值(整数和数值):

SV = PVNV(0x7fe602802750) at 0x7fe603002e70
  REFCNT = 1
  FLAGS = (PADMY,IOK,NOK,POK,pIOK,pNOK,pPOK)
  IV = 0
  NV = 0
  PV = 0x7fe6026016b0 ""\0
  CUR = 0
  LEN = 16

还有其他种类的双重武器。例如,$!错误变量包含错误号和错误文本(我在Mastering Perl中谈到它)。这通常不必担心,因为Perl为上下文做了正确的事情。

如果您总是想要一个数值,请在数字上下文中使用它:

my $numeric = 0 + $result;   # 0

您可以使用Scalar::Util&#39; dualvar创建自己的双变量,并且可以检查标量是否为isdual的双变量。

use Scalar::Util qw(isdual);
my $result = ( 1 == 2 );
print isdual($result) ? "dualvar" : "Not dualvar";

如果您想检查您获得的值是否已定义(您说它不是'),您可以查看defined。但是,定义了一个空字符串。如果您想检查它不是空字符串,可以使用length。当您拥有的值不可打印时,这些会有所帮助。

答案 1 :(得分:3)

布尔运算符在true和&#39;&#39;上返回1在假。您正在尝试打印空字符串。

试试这个测试

use strict;
use warnings;
my $output = (2 <= 1); 
print $output ? "value=|$output|" : "value=<$output>";

答案 2 :(得分:1)

比较可以返回一个特殊的false值,该值为空字符串或0,具体取决于计算它的上下文。如果您要查找true和false的特定值,则使用如下语句会更安全:

my $output = ( 2 <= 1 ) ? 1 : 0;

以下代码将说明特殊false值的行为。

use 5.014; 
say ( 2 <= 1); # prints nothing
my $output = ( 2 <= 1 ) ? 1 : 0; 
say $output; # prints 0
$output = ( 2 > 1 ) ? 1 : 0 ; 
say int $output; # prints 1
say $output; # prints 1
$output = ( 2 <= 1 ) ; 
say int $output ; # prints 0

如果你不熟悉? :构造见:http://perldoc.perl.org/perlop.html#Conditional-Operator

答案 3 :(得分:-1)

该表达式返回一个空字符串(""),Perl认为它在评估ifunless等句子时是假值。

在Perl中,0"0"和空字符串("")为false。 undef也是假的,但您可能会收到警告。其他任何事都是真的。