Portanto, tenho um arquivo cheio de comandos de teste que gosto de executar em algumas de minhas funções para ter certeza de que estão lidando corretamente com todas as situações possíveis. Não faz sentido ter comandos duplicados. Aqui estão alguns exemplos:
rap ,Xflg MIT X11
rap ,XPBfl 'MITER'
rap ,Bflg share git-grep
rap ,bfl X11
rap ,Bfl xzfgrep
rap ,Bf X11
... minha função 'rap' usa uma vírgula em vez de um travessão para indicar o início das opções de letras, então há alguns argumentos a seguir. Como a ordem dessas opções não importa:
rap ,Bf X11
rap ,fB X11
... são exatamente o mesmo comando. Fácil de remover linhas duplicadas do arquivo, é claro, no entanto, para evitar o problema acima, o que eu gostaria de fazer é classificar as opções em ordem alfabética para que o acima ficasse:
rap ,Bf X11
rap ,Bf X11
... e eu poderia excluir as duplicatas. Algo assim pode ser feito sem heroísmo? Observe que isso não está classificando 'por' a lista de opções, mas classificando as próprias opções.
Você poderia usar perl para capturar uma sequência de caracteres de palavras após uma vírgula, dividir o resultado em uma matriz, classificá-la e substituir o resultado:
Conforme solicitado, aqui está uma maneira (provavelmente abaixo do ideal) de classificar todas as opções de letras minúsculas antes de todas as maiúsculas:
Outra
perl
variante:Para sua exigência extra de ter letras minúsculas antes das maiúsculas, você pode confiar no fato de que em ASCII
'x'
é'X' ^ 32
(e'X'
é'x' ^ 32
):Usando Raku (anteriormente conhecido como Perl_6)
Raku é uma linguagem de programação da família Perl que oferece suporte integrado de alto nível para Unicode. Acima está uma tradução Raku do excelente código Perl de @steeldriver (com uma homenagem a @StéphaneChazelas).
s///
formulário pode ser escritos{ … } = " … "
. Curlies na metade de substituição (dentro das aspas duplas) significam um bloco de código que é executado na captura.<?after X > Y
(o negativo usa a!
em vez de a?
).$0
ecomb
, que - na ausência de um argumento regex - quebra em cada caractere.Entrada de amostra:
Saída de amostra:
Alfabetize as opções de letras com letras minúsculas primeiro:
Acima usa a representação Unicode de letras minúsculas
<:Ll>
(veja o primeiro link abaixo para obter detalhes). Também está em exibição o operador ternário de Raku: Test??
True!!
False (veja o segundo link abaixo para detalhes).https://docs.raku.org/linguagem/regexes#Predefinido_character_classes
https://docs.raku.org/linguagem/operators#infix_??_! !
https://docs.raku.org/linguagem/regexes
https://raku.org