几乎所有情况下(即除非有特殊原因),Perl返回两个静态分配的标量之一:
&PL_sv_yes
(表示真)和
&PL_sv_no
(表示假)。以下是它们的详细信息:
>perl -MDevel::Peek -e"Dump 1==1"
SV = PVNV(0x749be4) at 0x3180b8
REFCNT = 2147483644
FLAGS = (PADTMP,IOK,NOK,POK,READONLY,pIOK,pNOK,pPOK)
IV = 1
NV = 1
PV = 0x742dfc "1"\0
CUR = 1
LEN = 12
>perl -MDevel::Peek -e"Dump 1==0"
SV = PVNV(0x7e9bcc) at 0x4980a8
REFCNT = 2147483647
FLAGS = (PADTMP,IOK,NOK,POK,READONLY,pIOK,pNOK,pPOK)
IV = 0
NV = 0
PV = 0x7e3f0c ""\0
CUR = 0
LEN = 12
yes
是一个三元变量(IOK,NOK和POK)。它包含一个带符号整数(IV),值为1,一个浮点数(NV),值为1,和一个字符串(PV),值为1。
no
也是一个三元变量(IOK,NOK和POK)。它包含一个带符号整数(IV),值为0,一个浮点数(NV),值为0,和一个空字符串(PV)。这意味着它会被字符串化为空字符串,并且将其转换为数字时结果为0。它既不等于空字符串,也不等于数字0。
>perl -wE"say 0+(1==0);"
0
>perl -wE"say 0+'';"
Argument "" isn't numeric in addition (+) at -e line 1.
0
不是零 0
>perl -wE"say ''.(1==0);"
>perl -wE"say ''.0;"
0
不能保证这种情况总是不变的。也没有理由依赖这一点。如果您需要特定的值,可以使用类似以下的方法:
my $formatted = $result ? '1' : '0';
!!
伪运算符。它非常有用,可以返回通用的真值或假值,而不是一些神奇数字。 - amon