42,42.0,“42.0”,“42”之间是否有任何区别

时间:2012-09-25 08:39:25

标签: perl

在使用“智能匹配(~~)”测试我的Perl代码的过程中,我遇到了这个问题。 42,42.0,“42.0”,“42”

之间是否存在差异?
$var1 = "42";
$var2 = "42.0";
$a = $var1 ~~ $var2;

我的$a为0;这意味着$var1$var2不相等。

请解释。

3 个答案:

答案 0 :(得分:26)

智能匹配运营商将“通常做你想做的事”。请将此读作“并不总是”。

42 ~~ 42.0返回true。

42 ~~ "42.0"也返回true:字符串与数字进行比较,因此被视为数字。同上"42" ~~ 42.0

"42" ~~ "42.0"返回false:两个参数都是字符串,并且这些字符串不会比较为“相等”,尽管它们的数字含义是。您不希望Perl将"two" ~~ "two-point-oh"视为真实。

可以通过添加零来强制字符串进行数字解释:

0+"42" ~~ "42.0"再次返回true,因为第一个字符串被强制为数字42,第二个字符串紧随其后。

perldoc perlsynperldoc perlop page定义了智能匹配的工作原理:

       Object  Any       invokes ~~ overloading on $object, or falls back:
       Any     Num       numeric equality         $a == $b
       Num     numish[4] numeric equality         $a == $b
       undef   Any       undefined                !defined($b)
       Any     Any       string equality          $a eq $b

您可以看到字符串相等是默认值。

答案 1 :(得分:8)

您现在可能想重新考虑使用智能匹配。 Perl社区认为当前的实现是一个错误,其中包括你的问题和amon的回答。

正在进行一项“更健全”且更简单但不兼容的智能匹配版本的工作,这可能是Perl的下一个主要版本(5.18)。它只会取缔你的例子:当$ b是一个简单的标量值(如42或“42”)时,将不允许$ a ~~ $ b。

如果您手头有太多时间,可以仔细阅读Perl5 porters档案,例如this thread

答案 2 :(得分:2)

上下文输入。

$Var1$Var2最后用作字符串(在赋值中),所以现在它们表现为字符串。如果两个参数都是字符串,~~将进行字符串比较。

如果您使用其中一个作为数字 - 您甚至不需要分配它 - 那么它将表现为数字,~~将使用数字比较。

此脚本将输出NO YES

my $v1 = "42";
my $v2 = "42.0";
print (($v1 ~~ $v2) ? 'YES ' : 'NO ');

$v1 + 0;
print (($v1 ~~ $v2) ? 'YES ' : 'NO ');

Reference for ~~ operator