perl oneliner - 具有非字母数字的随机字符串生成器

perl oneliner - 具有非字母数字的随机字符串生成器

如何将非字母数字字符添加到地图中,以便生成字母数字和非字母数字字符的混合?

$ 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

答案1

使用chr功能:

perl -le 'print map chr 33 + rand 94, 1 .. 1000'

答案2

自从在这条评论您要求一种添加自定义字符的方法,一种方法是将它们添加到带有 的列表中qw//,只需记住更新 中的计数即可rand 67

perl -le 'print map { (a..z,A..Z,0..9,qw{- _ / & ?})[rand 67] } 0..100'

答案3

假设这不仅仅是您正在处理的一些简单的挑战,并且想要了解更多信息,那么有一些方法可以使其更容易开发和维护。 (等等,我刚才是不是用了那些关于 Perl 的单行话?!)

我讨厌在更改内容时必须计算字符数并进行更新。除非你致力于成为一个单身的Perl 行中,我建议先构建列表,然后使用它,这意味着您可以 a) 使用其他方式构建字符列表,b) 询问它稍后有多长。

我喜欢正则表达式提供的有用字符集,让您表示相关字符组(如果这对您的用例有意义),因此我将采取的更通用的方法是:

构建字符列表(使用您的示例,并添加“!”和“-”,如您的评论中所述)。这是生成全部7 位 ASCII 字符(最多 127 个),然后仅保留与字符类匹配的内容:

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

然后发出它们的随机序列(“rand @chars”强制“@chars”进入数字上下文,并给出从 0 开始的数组长度):

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

把它们放在一起,看起来像这样:

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

您可以简单地将每个字符显式添加到类中(小心转义需要它的东西:例如我只没有转义破折号,因为它位于末尾)

阅读部分或全部内容perlrechar类文档获取更多信息。

在我的示例中,我只选择了“127”,因为看起来您只对基本的 7 位 ASCII 内容感兴趣。

如果你对一些更深奥的东西感兴趣,你就必须跑到更大的数字。对于一些数字方面的乐趣,请尝试:

@chars = grep /\p{Numeric_Type=Digit}/, map chr, 0..65535

相关内容