Perl的。检查标量值是否为零

时间:2013-06-06 05:29:40

标签: perl

我需要检查标量的值是否为0.但是对于我的检查,“0”和其他情况都是错误的。我怎么检查它?

3 个答案:

答案 0 :(得分:3)

您可以使用

检查标量的值是否为零
$scalar == 0

你真的不应该,但你可以使用以下方法检查标量是否包含值为零的IV(有符号整数),UV(无符号整数)或NV(浮点数):

use Inline C => <<'__END_OF_C__';

   IV contains_numerical_zero(SV* sv) {
      SvGETMAGIC(sv);

      if (SvIOKp(sv))  /* If the SV contains an IV or UV */
         return SvIV(sv) == 0;

      if (SvNOKp(sv))  /* If the SV contains an NV */
         return SvNV(sv) == 0;

      return 0;
   }

__END_OF_C__

say contains_numerical_zero(...) ? "yes" : "no";

注意,如果标量包含一个等于零的signed int和一个包含零字符的字符串,contains_numerical_zero将返回true。

答案 1 :(得分:1)

根据您对问题的评论,我知道您想知道perl是否认为标量是数字或字符串。这可以使用Devel::Peek模块完成。

use Devel::Peek 'Dump';

$a = 0;
Dump $a;

这将打印:

SV = IV(0x6750a8) at 0x6750b8
  REFCNT = 1
  FLAGS = (IOK,pIOK)
  IV = 0

鉴于:

$b = '0';
Dump $b;

将打印:

SV = PV(0x654c20) at 0x675058
  REFCNT = 1
  FLAGS = (POK,pPOK)
  PV = 0x66e110 "0"\0
  CUR = 1
  LEN = 16

答案 2 :(得分:0)

如果您只关心“ 0” ...

使用字符串比较。

if($a eq "0") {
     print("Zero!");
} else {
     print("Not zero!");
}

如果您只设置my $a;,那么当我们想要返回if($a == 0)时,true将返回false

通过使用字符串比较,您可以确定地进行检查。

如果您关心“ 0.0”,“ 000”等...

如果您担心诸如0.00000之类的值,则可以split('', $string)统一片段,重新加入,然后比较为“ 0”。或“ 0”,例如...

my $simplestring = join('', uniq split('', $number));
if($simplestring eq '0.' || $simplestring eq '0') {
     print("Zero!");
} else {
     print("Not zero!");
}