我需要检查标量的值是否为0.但是对于我的检查,“0”和其他情况都是错误的。我怎么检查它?
答案 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.00
或000
之类的值,则可以split('', $string)
统一片段,重新加入,然后比较为“ 0”。或“ 0”,例如...
my $simplestring = join('', uniq split('', $number));
if($simplestring eq '0.' || $simplestring eq '0') {
print("Zero!");
} else {
print("Not zero!");
}