因此,我有一个充满测试命令的文件,我喜欢对我的一些函数运行这些命令,以确保它们正确处理所有可能的情况。虽然有重复的命令是没有意义的。以下是一些示例:
rap ,Xflg MIT X11
rap ,XPBfl 'MITER'
rap ,Bflg share git-grep
rap ,bfl X11
rap ,Bfl xzfgrep
rap ,Bf X11
...我的函数“rap”使用逗号而不是破折号来指示字母选项的开头,然后是一些参数。由于这些选项的顺序并不重要:
rap ,Bf X11
rap ,fB X11
...是完全相同的命令。当然,很容易从文件中删除重复行,但是为了避免上述问题,我想要做的是按字母顺序对选项进行排序,以便上面的结果:
rap ,Bf X11
rap ,Bf X11
...然后我就可以删除重复项。没有英雄气概就能完成这样的事吗?请注意,这不是对选项列表进行排序,而是对选项本身进行排序。
您可以使用 perl 捕获逗号后面的单词字符序列,将结果拆分为数组,对其进行排序并替换结果:
根据要求,这是一种(可能不是最佳的)方法,可以将所有小写字母选项排序在所有大写字母选项之前:
另一种
perl
变体:对于在大写字母之前有小写字母的额外要求,您可以依靠以下事实:在 ASCII 中,
'x'
is'X' ^ 32
(和'X'
is'x' ^ 32
):使用Raku(以前称为 Perl_6)
Raku 是 Perl 系列中的一种编程语言,具有对内置 Unicode 的高级支持。上面是 @steeldriver 对优秀 Perl 代码的 Raku 翻译(向 @StéphaneChazelas 致敬)。
s///
可以写成s{ … } = " … "
。替换部分中的花括号(双引号内)表示在捕获上运行的代码块。<?after X > Y
(负向使用!
a 代替 a?
)。$0
、 和comb
,在没有正则表达式参数的情况下,它会在每个字符上中断。输入示例:
示例输出:
按字母顺序排列字母选项,小写在前:
上面使用小写字母的 Unicode 表示形式
<:Ll>
(详细信息请参阅下面的第一个链接)。同时展出的还有 Raku 的三元运算符:Test??
True!!
False(有关详细信息,请参阅下面的第二个链接)。https://docs.raku.org/language/regexes#Predefined_character_classes
https://docs.raku.org/language/operators#infix_??_!!
https://docs.raku.org/language/regexes
https://raku.org