在使用“Smart Match(~~)”测试我的 Perl 代码的过程中,我遇到了这个问题。42、42.0、“42.0”、“42”会有什么区别吗
$var1 = "42";
$var2 = "42.0";
$a = $var1 ~~ $var2;
我得到$a
了 0; 这意味着$var1
和$var2
不相等。
请解释。
在使用“Smart Match(~~)”测试我的 Perl 代码的过程中,我遇到了这个问题。42、42.0、“42.0”、“42”会有什么区别吗
$var1 = "42";
$var2 = "42.0";
$a = $var1 ~~ $var2;
我得到$a
了 0; 这意味着$var1
和$var2
不相等。
请解释。
智能匹配运算符将“通常做你想做的事”。请将此视为“并非总是”。
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 perlsyn
orperldoc 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
您可以看到字符串相等是默认设置。
上下文输入。
$Var1
并且$Var2
最后被用作字符串(在分配中),所以现在它们表现为字符串。~~
如果两个参数都是字符串,将进行字符串比较。
如果您将其中一个用作数字 - 您甚至不需要分配给它 - 那么它将表现为一个数字并~~
使用数字比较。
该脚本将输出NO YES
:
my $v1 = "42";
my $v2 = "42.0";
print (($v1 ~~ $v2) ? 'YES ' : 'NO ');
$v1 + 0;
print (($v1 ~~ $v2) ? 'YES ' : 'NO ');