我正在尝试执行此代码.令我困惑的是为什么这个比较在错误时没有返回任何值.这是这些比较运算符的默认行为吗?
my $output = (2 <= 1);
print "value=$output";
Run Code Online (Sandbox Code Playgroud)
undef当逻辑检查失败时,比较运算符是否会返回?
bri*_*foy 13
返回1表示true和已定义空字符串的特殊版本"",它计为零,但不受有关不正确数字转换的警告的影响,就像"0但是为真"一样.
你得到的价值实际上是一个双变量.它有单独的数字和字符串值(实际上不是空字符串的特殊版本).数值为0,字符串值为空字符串.你使用了字符串部分,它是空的,但0仍然存在.您可以使用Devel :: Peek查看变量记录:
use Devel::Peek;
my $result = ( 1 == 2 );
Dump( $result );
Run Code Online (Sandbox Code Playgroud)
在幕后的SV(标量值)事物中,您会看到PV中的字符串值和IV和NV中的数值(整数和数值):
SV = PVNV(0x7fe602802750) at 0x7fe603002e70
REFCNT = 1
FLAGS = (PADMY,IOK,NOK,POK,pIOK,pNOK,pPOK)
IV = 0
NV = 0
PV = 0x7fe6026016b0 ""\0
CUR = 0
LEN = 16
Run Code Online (Sandbox Code Playgroud)
还有其他种类的双重武器.例如,$!错误变量具有错误编号和错误文本(我在Mastering Perl中讨论了这一点).这通常不必担心,因为Perl为上下文做了正确的事情.
如果您总是想要一个数值,请在数字上下文中使用它:
my $numeric = 0 + $result; # 0
Run Code Online (Sandbox Code Playgroud)
您可以创建自己的dualvars 标量::的Util的dualvar,你可以检查是否标是一个dualvar isdual.
use Scalar::Util qw(isdual);
my $result = ( 1 == 2 );
print isdual($result) ? "dualvar" : "Not dualvar";
Run Code Online (Sandbox Code Playgroud)
如果你想检查你得到的值是否被定义(你说它不是),你可以检查定义.但是,定义了一个空字符串.如果要检查它不是空字符串,可以使用长度.当您拥有的值不可打印时,这些会有所帮助.
| 归档时间: |
|
| 查看次数: |
719 次 |
| 最近记录: |