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

VAR*_*121 13 perl

在使用"智能匹配(~~)"测试我的Perl代码的过程中,我遇到了这个问题.42,42.0,"42.0","42"之间是否有任何区别

$var1 = "42";
$var2 = "42.0";
$a = $var1 ~~ $var2;
Run Code Online (Sandbox Code Playgroud)

我得到$a0; 这意味着$var1$var2不平等.

请解释.

amo*_*mon 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页面定义智能匹配如何工作的:

       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
Run Code Online (Sandbox Code Playgroud)

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


msc*_*cha 8

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

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

如果你手上有太多时间,你可以仔细阅读Perl5搬运工档案,例如这个帖子.