3

我需要检查标量的值是否为 0。但是 '0' 和其他情况对于我的检查来说是错误的。我怎么能检查它?

4

3 回答 3

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";

请注意,contains_numerical_zero如果标量包含等于零的有符号整数和由字符零组成的字符串,则返回 true。

于 2013-06-06T06:00:04.653 回答
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
于 2013-06-06T05:58:38.240 回答
0

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

使用字符串比较。

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

如果你只是简单的设置my $a;,那么if($a == 0)就会返回true,当我们想要出来的时候就是返回false

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

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

如果您担心0.00, 或之类的值000,您可以split('', $string)uniq 片段,重新加入它们,然后比较“0”。或“0”,例如...

my $simplestring = join('', uniq split('', $number));
if($simplestring eq '0.' || $simplestring eq '0') {
     print("Zero!");
} else {
     print("Not zero!");
}
于 2020-10-09T17:29:20.773 回答