可以Perl6 cmp两个字符串不敏感吗?

p6s*_*eve 8 perl6 raku

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

是否有一些:我也许是这个副词?

dao*_*oad 11

如果你想要一个"字典"排序顺序,@ timotimo在他们建议collatecoll排序时就在正确的轨道上.

使用collate()任何listy进行排序.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)
Run Code Online (Sandbox Code Playgroud)


Bra*_*ert 10

Perl 6目前没有这个选项,但它是一种非常可变的语言,所以让我们添加它.

由于现有的proto不允许命名值,我们必须添加一个新的,或写一个onlysub.
(那就是你可以使用multi下面的内容,除了可选的only.)

这仅适用于词法,因此如果您这样写,您可能希望将proto/ onlysub 标记为可导出,具体取决于您正在执行的操作.

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  )
}
Run Code Online (Sandbox Code Playgroud)
say 'a' leg 'A';     # More
say 'a' leg 'A' :i;  # Same
say 'a' leg 'A' :!i; # More

say 'a' leg 'A' :ignore-case; # Same
Run Code Online (Sandbox Code Playgroud)

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

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


Cok*_*oke 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)
Run Code Online (Sandbox Code Playgroud)


Håk*_*and 5

文档中

为了进行不区分大小写的比较,您可以使用.fc (fold-case).问题是人们倾向于使用.lc或者.uc它似乎在ASCII范围内工作,但在其他角色上失败.这不仅仅是一个Perl 6陷阱,同样适用于其他语言.

例如:

say ‘groß’.fc eq ‘GROSS’.fc; # ? RIGHT; True 
Run Code Online (Sandbox Code Playgroud)

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