与所有不同的Perl 6相等运算符有什么关系? (==,===,eq,eqv,~~,=:=,…)
Perl 6似乎有一个平等的运算符爆炸。 什么是=:=
? leg
和cmp
什么区别? 或者eqv
和===
?
有没有人有一个很好的总结?
=:=testing两个容器(variables或数组的项目或哈希值)是否有别名,即如果一个变化,另一个变化呢?
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
至于其他: ===testing两个引用是否指向相同的对象, eqvtesting两个结构是否相等。 所以[1, 2, 3] === [1, 2, 3]
将是假的(不是相同的数组),但是[1, 2, 3] eqv [1, 2, 3]
)。
leg
比较像Perl 5的cmp
string,而Perl 6的cmp
更聪明,将比较像<=>
和leg
像string。
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
match $y
”的问题。 如果$y
是一个types,则是types检查。 如果$y
是一个正则expression式,它是正则expression式匹配 – 依此类推。
从今天的reddit:
Perl相等运算符的比较
概要3:比较语义中的概要是做你想做的,还是你已经阅读了? devise文档链接到使用这些function的testing文件,因此您可以看到它们的使用示例以及它们当前的testing状态。
Perl 6的比较运算符更适合dynamic语言和所有的事情。 现在你可以用一个你想要的操作符精确地testing一些东西,而不是仅仅比较string或数字(或者把东西变成string或数字)。 您可以testing值,容器,types等等。
在其中一个评论中,你问关于eqv
和cmp
。 在Perl 5的旧版本中, cmp
在那里进行sorting,并返回三个魔术值(-1,0,1)之一,并且总是使用string语义来完成。 在Perl 6中, cmp
返回三种types的Order
对象之一,所以你不必记住-1,0或1的含义。 另外,新的cmp
不会强制string语义,所以当交给数字时它可以变得更聪明(不同于Perl 5,它会像1,10,11,2,20,21 …那样sorting)。
leg
(比e qual, g reater than)是cmp
中的string语义。 它被定义为Perl 6的~$a cmp ~$b
,其中~
是强制string语义的新的“string上下文相关器”。 与leg
,你总是做一个string比较,就像旧的Perl 5 cmp
。
如果您对其他运营商仍然有疑问,请将其分解为单独的问题。 🙂
这也是一个方便的参考指南:
Perl6操作符的周期表