Perl6 cmp的两个字符串可以区分大小写吗?

时间:2018-08-03 18:36:49

标签: perl6

我正在进行排序,并且希望控制alpha值的cmp不区分大小写(即https://perl6.org/archive/rfc/143.html)。

也许有一些:i副词吗?

4 个答案:

答案 0 :(得分:11)

如果您想要“字典”排序顺序,则@timotimo在他们建议collatecoll进行排序时走在正确的轨道上。

对任何有礼貌的内容使用collate()对其进行排序。如果需要自定义排序,请使用coll作为中缀运算符。

$ perl6
To exit tyype 'exit' or '^D'
> <a Zp zo zz ab 9 09 91 90>.collate();
(09 9 90 91 a ab zo Zp zz)
> <a Zp zo zz ab 9 09 91 90>.sort: * coll *;
(09 9 90 91 a ab zo Zp zz)

答案 1 :(得分:10)

Perl 6目前没有该选项,但是它是一种非常易变的语言,因此让我们添加它。

由于现有的proto不允许使用命名值,因此我们必须添加一个新值或编写一个only子项。
(也就是说,除了可选的multi之外,您只能使用下面的only。)

这仅在词汇上适用,因此,如果您编写此代码,则可能要根据自己的工作将proto / only子项标记为可导出。

proto sub infix:<leg> ( \a, \b, *% ){*}

multi sub infix:<leg> ( \a, \b, :ignore-case(:$i) ){
  $i

  ?? &CORE::infix:<leg>( fc(a) , fc(b) )
  !! &CORE::infix:<leg>(    a  ,    b  )
}
say 'a' leg 'A';     # More
say 'a' leg 'A' :i;  # Same
say 'a' leg 'A' :!i; # More

say 'a' leg 'A' :ignore-case; # Same

请注意,:$i:i( $i )的缩写,因此两个命名参数可以写为:
:ignore-case( :i( $i ) )

我还使用了fc()的子形式,而不是方法形式的.fc,因为它允许使用字符串的本机形式而不会引起自动装箱。

答案 2 :(得分:7)

您可以传递代码块进行排序。如果块的Arity为1,则在进行比较时,它对两个元素都起作用。这是显示上一个答案中的“ fc”的示例。

> my @a = <alpha BETA gamma DELTA>;
[alpha BETA gamma DELTA]
> @a.sort
(BETA DELTA alpha gamma)
> @a.sort(*.fc)
(alpha BETA DELTA gamma)

答案 3 :(得分:5)

documentation

  

为了进行不区分大小写的比较,您可以使用.fc   (折叠)。问题是人们倾向于使用.lc.uc,并且   确实可以在ASCII范围内工作,但在其他方面却失败   字符。这不仅是一个Perl 6陷阱,其他情况也是如此   语言。

例如:

say ‘groß’.fc eq ‘GROSS’.fc; # ← RIGHT; True 

如果使用正则表达式,则无需使用.fc,而可以使用:i:ignorecase)副词。