首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当数字比较为假时,Perl返回什么?

当数字比较为假时,Perl返回什么?
EN

Stack Overflow用户
提问于 2014-11-12 17:30:44
回答 4查看 1.2K关注 0票数 4

我正在尝试执行这段代码。令我困惑的是,为什么这个比较不返回任何值时,假的。这是这些比较运算符的默认行为吗?

代码语言:javascript
运行
复制
my $output = (2 <= 1); 
print "value=$output";

当比较运算符的逻辑检查失败时,它会返回undef吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-11-12 18:56:50

The 关系算子

返回1用于true和定义的空字符串的特殊版本"“,该字符串算作零,但不受关于不正确的数值转换的警告,就像"0但true”一样。

返回的值实际上是一个dualvar。它有单独的数值和字符串值(实际上不是空字符串的特殊版本)。数值为0,字符串值为空字符串。您使用了字符串部分,它是空的,但是0仍然存在。您可以使用发展::窥视查看变量记录。

代码语言:javascript
运行
复制
use Devel::Peek;
my $result = ( 1 == 2 );
Dump( $result );

在幕后的SV (标量值)事件中,您可以在PV中看到字符串值,在IV和NV (整数和数值)中看到数值:

代码语言:javascript
运行
复制
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

还有其他类型的双轨望远镜。例如,$!错误变量有错误号和错误文本(我在掌握Perl中谈到了这一点)。这不是您通常需要担心的事情,因为Perl为上下文做了正确的事情。

如果您总是想要一个数值,请在数值上下文中使用它:

代码语言:javascript
运行
复制
my $numeric = 0 + $result;   # 0

您可以使用标量::Utildualvar创建自己的双变量,并且可以检查标量是否为带有isdual的dualvar。

代码语言:javascript
运行
复制
use Scalar::Util qw(isdual);
my $result = ( 1 == 2 );
print isdual($result) ? "dualvar" : "Not dualvar";

如果您想检查返回的值是否已定义(您说没有定义),可以使用已定义进行检查。但是,空字符串是定义的。如果要检查是否为空字符串,可以使用长度。当您所拥有的值不可打印时,这些都会有所帮助。

票数 13
EN

Stack Overflow用户

发布于 2014-11-12 17:42:37

布尔运算符在true上返回1,在false上返回'‘。您正在尝试打印空字符串。

试试这个做个测试

代码语言:javascript
运行
复制
use strict;
use warnings;
my $output = (2 <= 1); 
print $output ? "value=|$output|" : "value=<$output>";
票数 3
EN

Stack Overflow用户

发布于 2014-11-12 18:47:14

比较可以返回一个特殊的虚值,即空字符串或0,这取决于计算它的上下文。如果要查找true和false的特定值,则使用如下语句要安全得多:

代码语言:javascript
运行
复制
my $output = ( 2 <= 1 ) ? 1 : 0;

下面的代码将说明特殊虚值的行为。

代码语言:javascript
运行
复制
use 5.014; 
say ( 2 <= 1); # prints nothing
my $output = ( 2 <= 1 ) ? 1 : 0; 
say $output; # prints 0
$output = ( 2 > 1 ) ? 1 : 0 ; 
say int $output; # prints 1
say $output; # prints 1
$output = ( 2 <= 1 ) ; 
say int $output ; # prints 0

如果您不熟悉?:结构,请参阅:http://perldoc.perl.org/perlop.html#Conditional-Operator

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26892957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档