42

Perl 6 似乎有大量的相等运算符。是什么=:=leg和有什么区别cmp?或者eqv===

谁有好的总结?

4

3 回答 3

44

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

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]会是假的(不是同一个数组),但[1, 2, 3] eqv [1, 2, 3]会是真的(相同的结构)。

leg比较像 Perl 5's 这样的字符串cmp,而 Perl 6'scmp更智能,并且会比较数字 like<=>和字符串 like 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是正则表达式,则它是正则表达式匹配 - 等等。

于 2008-10-06T22:00:15.197 回答
19

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

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

在其中一条评论中,您询问了eqvand cmp。在 Perl 5 的旧时代,cmp它用于排序并返回三个魔法值之一(-1,0,1),并且它总是使用字符串语义来做到这一点。在 Perl 6 中,cmp返回三种类型的Order对象之一,因此您不必记住 -1、0 或 1 的含义。此外,新的cmp不强制字符串语义,所以它可以更聪明地处理数字(不像 Perl 5 的排序为 1、10、11、2、20、21 ...)。

小于leg,等于,大于字符串语义。它被定义为 Perl 6's ,其中是强制字符串语义的新“字符串上下文化器”。使用,您总是在进行字符串比较,就像旧的 Perl 5 一样。cmp~$a cmp ~$b~legcmp

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

于 2008-10-07T05:24:36.830 回答
3

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

Perl6 运算符周期表

于 2010-04-14T14:47:21.020 回答