我正在尝试执行此代码。令我困惑的是为什么这个比较在错误时不会返回任何值。这是这些比较运算符的默认行为吗?
my $output = (2 <= 1);
print "value=$output";
当逻辑检查失败时,比较运算符会返回undef
吗?
答案 0 :(得分:13)
返回1表示true和特定版本的已定义空字符串,&#34;&#34; ,它被视为零,但不受有关不正确的数字转换的警告,就像&#34; 0但是真的&#34;是
你得到的价值实际上是双变量。它有单独的数字和字符串值(实际上不是空字符串的特殊版本)。数值为0,字符串值为空字符串。你使用了字符串部分,它是空的,但0仍然存在。您可以使用Devel::Peek:
查看变量记录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
还有其他种类的双重武器。例如,$!
错误变量包含错误号和错误文本(我在Mastering Perl中谈到它)。这通常不必担心,因为Perl为上下文做了正确的事情。
如果您总是想要一个数值,请在数字上下文中使用它:
my $numeric = 0 + $result; # 0
您可以使用Scalar::Util&#39; dualvar
创建自己的双变量,并且可以检查标量是否为isdual
的双变量。
use Scalar::Util qw(isdual);
my $result = ( 1 == 2 );
print isdual($result) ? "dualvar" : "Not dualvar";
如果您想检查您获得的值是否已定义(您说它不是'),您可以查看defined。但是,定义了一个空字符串。如果您想检查它不是空字符串,可以使用length。当您拥有的值不可打印时,这些会有所帮助。
答案 1 :(得分:3)
布尔运算符在true和&#39;&#39;上返回1在假。您正在尝试打印空字符串。
试试这个测试
use strict;
use warnings;
my $output = (2 <= 1);
print $output ? "value=|$output|" : "value=<$output>";
答案 2 :(得分:1)
比较可以返回一个特殊的false值,该值为空字符串或0,具体取决于计算它的上下文。如果您要查找true和false的特定值,则使用如下语句会更安全:
my $output = ( 2 <= 1 ) ? 1 : 0;
以下代码将说明特殊false值的行为。
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
答案 3 :(得分:-1)
该表达式返回一个空字符串(""
),Perl认为它在评估if
或unless
等句子时是假值。
在Perl中,0
,"0"
和空字符串(""
)为false。 undef
也是假的,但您可能会收到警告。其他任何事都是真的。