13

在使用“Smart Match(~~)”测试我的 Perl 代码的过程中,我遇到了这个问题。42、42.0、“42.0”、“42”会有什么区别吗

$var1 = "42";
$var2 = "42.0";
$a = $var1 ~~ $var2;

我得到$a了 0; 这意味着$var1$var2不相等。

请解释。

4

3 回答 3

26

智能匹配运算符将“通常做你想做的事”。请将此视为“并非总是”。

42 ~~ 42.0返回真。

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

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

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

0+"42" ~~ "42.0"再次返回 true,因为第一个字符串被强制为 number 42,第二个也是如此。

perldoc perlsynorperldoc 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

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

于 2012-09-25T08:53:14.460 回答
8

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

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

如果您手头有太多时间,您可以仔细阅读Perl5 搬运工档案,例如这个线程

于 2012-09-25T10:23:19.040 回答
2

上下文输入。

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

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

该脚本将输出NO YES

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

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

~~操作员参考

于 2012-09-25T08:55:19.597 回答