我正在进行排序,并且希望控制alpha值的cmp不区分大小写(即https://perl6.org/archive/rfc/143.html)。
也许有一些:i副词吗?
答案 0 :(得分:11)
如果您想要“字典”排序顺序,则@timotimo在他们建议collate
和coll
进行排序时走在正确的轨道上。
对任何有礼貌的内容使用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)
为了进行不区分大小写的比较,您可以使用
.fc
(折叠)。问题是人们倾向于使用.lc
或.uc
,并且 确实可以在ASCII范围内工作,但在其他方面却失败 字符。这不仅是一个Perl 6陷阱,其他情况也是如此 语言。
例如:
say ‘groß’.fc eq ‘GROSS’.fc; # ← RIGHT; True
如果使用正则表达式,则无需使用.fc
,而可以使用:i
(:ignorecase
)副词。