与所有不同的Perl 6相等运算符有什么关系? (==,===,eq,eqv,~~,=:=,...)

时间:2008-10-06 21:48:22

标签: operators perl6 raku

Perl 6似乎爆发了相等的运算符。什么是=:=legcmp之间有什么区别?或eqv===

有没有人有一个很好的总结?

4 个答案:

答案 0 :(得分:38)

=:=测试两个容器(变量或数组或散列项)是否有别名,即如果一个变化,另一个变化也是如此?

my $x;
my @a = 1, 2, 3;
# $x =:= @a[0] is false
$x := @a[0];
# now $x == 1, and $x =:= @a[0] is true
$x = 4;
# now @a is 4, 2, 3 

至于其他人:===测试两个引用是否指向同一个对象,eqv测试两个结构是否相同。因此[1, 2, 3] === [1, 2, 3]将为false(不是相同的数组),但[1, 2, 3] eqv [1, 2, 3]将为true(相同的结构)。

leg比较Perl 5 cmp之类的字符串,而Perl 6的cmp更智能,会比较<=>等数字和leg等字符串。

13 leg 4   # -1, because 1 is smaller than 4, and leg converts to string
13 cmp 4   # +1, because both are numbers, so use numeric comparison.

最后~~是“智能匹配”,它回答了问题“$x匹配$y”。如果$y是类型,则进行类型检查。如果$y是正则表达式,那么它是正则表达式匹配 - 依此类推。

答案 1 :(得分:21)

答案 2 :(得分:15)

Synopsis 3: Comparison semantics中的摘要是否符合您的要求,或者您是否已阅读该摘要?设计文档链接到使用这些功能的测试文件,因此您可以看到它们的使用示例及其当前的测试状态。

Perl 6的比较运算符更适合动态语言和所有正在发生的事情。现在,您可以使用符合您需要的操作员精确测试事物,而不仅仅是比较字符串或数字(或将事物转换成字符串或数字)。您可以测试值,容器,类型等。

在其中一条评论中,您会询问eqvcmp。在Perl 5的旧时代,cmp用于排序并返回三个魔术值(-1,0,1)中的一个,并且它始终使用字符串语义。在Perl 6中,cmp返回三种Order对象中的一种,因此您不必记住-1,0或1的含义。此外,新的cmp不强制字符串语义,因此它在传递数字时更聪明(不像Perl 5那样排序为1,10,11,2,20,21 ......)。 p>

leg l ess than, e qual, g reater)是cmp的字符串语义。它被定义为Perl 6的~$a cmp ~$b,其中~是强制字符串语义的新“字符串上下文化器”。使用leg,您总是在进行字符串比较,就像旧的Perl 5 cmp一样。

如果您对其他运营商仍有疑问,请将其分解为单独的问题。 :)

答案 3 :(得分:3)

这也是一个方便的参考指南:

Perl6 Periodic Table of Operators