我正在尝试执行这段代码。令我困惑的是,为什么这个比较不返回任何值时,假的。这是这些比较运算符的默认行为吗?
my $output = (2 <= 1);
print "value=$output";当比较运算符的逻辑检查失败时,它会返回undef吗?
发布于 2014-11-12 18:56:50
The 关系算子
返回1用于true和定义的空字符串的特殊版本"“,该字符串算作零,但不受关于不正确的数值转换的警告,就像"0但true”一样。
返回的值实际上是一个dualvar。它有单独的数值和字符串值(实际上不是空字符串的特殊版本)。数值为0,字符串值为空字符串。您使用了字符串部分,它是空的,但是0仍然存在。您可以使用发展::窥视查看变量记录。
use Devel::Peek;
my $result = ( 1 == 2 );
Dump( $result );在幕后的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还有其他类型的双轨望远镜。例如,$!错误变量有错误号和错误文本(我在掌握Perl中谈到了这一点)。这不是您通常需要担心的事情,因为Perl为上下文做了正确的事情。
如果您总是想要一个数值,请在数值上下文中使用它:
my $numeric = 0 + $result; # 0您可以使用标量::Util的dualvar创建自己的双变量,并且可以检查标量是否为带有isdual的dualvar。
use Scalar::Util qw(isdual);
my $result = ( 1 == 2 );
print isdual($result) ? "dualvar" : "Not dualvar";如果您想检查返回的值是否已定义(您说没有定义),可以使用已定义进行检查。但是,空字符串是定义的。如果要检查是否为空字符串,可以使用长度。当您所拥有的值不可打印时,这些都会有所帮助。
发布于 2014-11-12 17:42:37
布尔运算符在true上返回1,在false上返回'‘。您正在尝试打印空字符串。
试试这个做个测试
use strict;
use warnings;
my $output = (2 <= 1);
print $output ? "value=|$output|" : "value=<$output>";发布于 2014-11-12 18:47:14
比较可以返回一个特殊的虚值,即空字符串或0,这取决于计算它的上下文。如果要查找true和false的特定值,则使用如下语句要安全得多:
my $output = ( 2 <= 1 ) ? 1 : 0;下面的代码将说明特殊虚值的行为。
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
https://stackoverflow.com/questions/26892957
复制相似问题