返回布尔实际返回的Perl函数是什么

Ano*_*don 12 perl boolean return

Perl 定义的函数(以及许多其他函数)返回"布尔值".

鉴于Perl实际上没有布尔类型(并且使用值为1表示true,0undef表示false)Perl语言是否准确指定了布尔值的返回值?例如,会defined(undef)返回0undef,是否会发生变化?

ike*_*ami 14

在几乎所有情况下(即除非有理由不这样做),Perl返回两个静态分配标量中的一个:( &PL_sv_yes对于true)和&PL_sv_no(对于false).这是他们的详细信息:

>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
Run Code Online (Sandbox Code Playgroud)

yes是三重变量(IOK,NOK和POK).它包含一个等于1的有符号整数(IV),一个等于1的浮点数(NV)和一个等于1的字符串(PV).

no也是三重变量(IOK,NOK和POK).它包含一个等于0的有符号整数(IV),一个等于0的浮点数(NV)和一个空字符串(PV).这意味着它将字符串化为空字符串,并将其编号为0.它既不等同于空字符串

>perl -wE"say 0+(1==0);"
0

>perl -wE"say 0+'';"
Argument "" isn't numeric in addition (+) at -e line 1.
0
Run Code Online (Sandbox Code Playgroud)

也不是 0

>perl -wE"say ''.(1==0);"


>perl -wE"say ''.0;"
0
Run Code Online (Sandbox Code Playgroud)

无法保证始终如此.并且没有理由依赖于此.如果您需要特定值,可以使用类似的东西

my $formatted = $result ? '1' : '0';
Run Code Online (Sandbox Code Playgroud)

  • 特殊的假值[记录在perlsyn](http://perldoc.perl.org/perlsyn.html#Truth-and-Falsehood).虽然这并不能保证它永远不会改变,但Perl 5并没有在没有充分理由的情况下破坏向后兼容性. (5认同)
  • ikegami你可以考虑添加一个链接到[这个答案](http://stackoverflow.com/a/3914490/257635)获取更多信息:) (2认同)

yst*_*sth 6

它们返回一个特殊的false值,在字符串上下文中为"",但在数字上下文中为0(没有非数字警告).真正的价值并不是那么特别,因为它在任何一种情况下都是1.定义()并没有返回undef.

(您可以自己创建类似的值,例如Scalar::Util::dualvar(0,"").)