relational operators
返回 1 表示 true 和定义的空字符串的特殊版本 "" ,它算作零,但不会收到有关不正确数字转换的警告,就像 "0 but true" 一样。
你得到的值实际上是一个双变量。它具有单独的数字和字符串值(实际上不是空字符串的特殊版本)。数值为 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 的dualvar 创建自己的双变量,并且可以使用isdual 检查标量是否是双变量。
use Scalar::Util qw(isdual);
my $result = ( 1 == 2 );
print isdual($result) ? "dualvar" : "Not dualvar";
如果您想检查您返回的值是否已定义(您说没有),您可以通过defined 进行检查。但是,定义了一个空字符串。如果要检查它是否不是空字符串,可以使用length。当您拥有的值不可打印时,这些会有所帮助。