perl oneliner - gerador de string aleatório com não alfanumérico [fechado]

0

como adicionar caracteres não alfanuméricos ao mapa para gerar um mix de caracteres alfanuméricos e não alfanuméricos?

$ for i in {1..5};do perl -le 'print map { (a..z,A..Z,0..9)[rand 62] } 0..pop' 100;done
feUhC59cHXl1s39T1LIiQVQVhVOMI9I2c11wZZKjitE4gVl4LAup7s2ZUeprkSWBqNkEiZVM66m73Zkk2lRb37VcgEz5PDX0YIMao
mjIvFkxFLyzw6BXwnqLj3SrliLXivrvDFhB6Vo9R8pnemm8LlyzeXeNF9x5haCvS8iLHRflPn1wpORlexka1G2yi9E8tDRXi0sNYt
FT2SpObqjVaHhSw18zegl4V2C6SOWe65HEJwA4U2EpOBpWukTThdzgaRCLAjOfHmAocZpPhdnyIe3SmvGncODw1W6gR9j8GjLWUbq
jCmX3J34hOcDiOkpSTadMyChkO8jkGOiThbE9W2esnHRPGutBCPVTxLIuLN7onlYnMKrD7oGzPG0szpS6ijoncXSzn3MzdwrFLWJw
H4vmVPWcOqwieRagETfUJJA7wIrIFOB6LcANFSnC5fJeZ9KJvusfABFa50NWQ8NugeIpP4nrIWzNLkZhLiCuCLlNbkAPpBgCvB9Ga
    
por DonJ 06.03.2018 / 19:46

3 respostas

3

Use a função chr :

perl -le 'print map chr 33 + rand 94, 1 .. 1000'
    
por 06.03.2018 / 19:59
1

Já que em este comentário você pedimos uma maneira de adicionar caracteres personalizados, uma forma de fazer isso é apenas adicioná-los à lista com qw// , lembre-se de atualizar a contagem em rand 67 .

perl -le 'print map { (a..z,A..Z,0..9,qw{- _ / & ?})[rand 67] } 0..100'
    
por 07.03.2018 / 21:08
0
No pressuposto de que isso é mais do que apenas um desafio de uma linha que você está lidando e quer aprender mais, existem maneiras de tornar isso um pouco mais fácil de desenvolver e manter. (espere, eu acabei de usar essas palavras sobre um one-liner Perl ?!)

Eu odeio ter que contar os personagens e atualizar quando mudo as coisas. A menos que você esteja comprometido com isso sendo apenas uma linha única de Perl, sugiro construir a lista primeiro e depois usá-la, o que significa que você pode a) usar outra forma de construir a lista de caracteres, eb) pergunte quanto tempo demora.

Eu gosto dos conjuntos de caracteres úteis que Expressões Regulares oferecem, para permitir que você represente grupos de caracteres relacionados (se isso for significativo para seu caso de uso), portanto, uma abordagem um pouco mais generalizada seria:

Crie a lista de caracteres (usando o seu exemplo e adicionando "!" e "-" como mencionado no seu comentário). O que isto faz é gerar todos os caracteres ASCII de 7 bits (até 127), e então manter apenas o que corresponde à classe de caracteres:

@chars = grep /[a-zA-Z0-9!-]/, map chr, 0..127

Em seguida, emita uma sequência aleatória deles ("rand @chars" forces "@chars" no contexto numérico e fornece o comprimento baseado em 0 da matriz):

print map { $chars[rand @chars] } 0..pop

Junte tudo e fique assim:

perl -le '@chars = grep /[a-zA-Z0-9!-]/, map chr, 0..127;print map { $chars[rand @chars] } 0..pop' 100

Você poderia simplesmente adicionar cada caractere explicitamente à turma (tenha cuidado para escapar de coisas que precisam dela: por exemplo, só que eu não escapou do traço porque está no final)

Leia algumas ou todas as documentação da perlrecharclass para obter informações adicionais.

No meu exemplo, eu só subi para "127" porque parecia que você estava interessado apenas em coisas ASCII básicas de 7 bits.

Se você estiver interessado em alguma coisa mais esotérica, terá que chegar a números maiores. Para alguma diversão numérica, tente:

@chars = grep /\p{Numeric_Type=Digit}/, map chr, 0..65535
    
por 07.03.2018 / 23:08

Tags