我需要检查标量的值是否为 0。但是 '0' 和其他情况对于我的检查来说是错误的。我怎么能检查它?
问问题
4673 次
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 回答