我正试图在我的42个字符密码中获得随机小写/大写字母。不知何故 我改为:
ucclcjuczlclucmlc0lcdlc5lc0ucdlccucmucquc5ucslc4lckucxuctlcvlcquclucpuc0ucvlczucducauczlcauc7lciucmlcplcjucolchucmucpuc9lcilcqlck
这是我的代码:
@a = (0 .. 9, 'a' .. 'z');
@case = ('lc','uc');
my $x = join '', map { scalar $case[rand(0-2)], $a[int rand @a]} 0 .. 42;
print "$x\n";
任何提示?
答案 0 :(得分:5)
为什么不选择一个随机的字母数字字符(在字母的情况下,可以是大写或小写)?
use strict;
use warnings;
my @chars=("a".."z","A".."Z",0..9);
my $password="";
foreach(1..42)
{
#tack on a random alphanumeric character
$password.=$chars[int(rand(@chars))]
}
print $password . "\n";
如果您想让lc
或uc
成为流程的明确部分,您可以执行以下操作:
use strict;
use warnings;
my @chars=("a".."z",0..9);
my $password="";
foreach(1..42)
{
my $char=$chars[int(rand(@chars))];
$char=uc($char) if rand() <0.5;
$password.=$char;
}
print $password . "\n";
答案 1 :(得分:5)
问题是您希望将字符串(uc
或lc
)作为代码执行,但它们永远不会传递给解析器。您可以使用eval EXPR
将它们传递给解析器,但这不是正确的方法。
my @chars = ('0'..'9', 'a'..'z');
my $passwd =
join '',
map rand >= 0.5 ? uc : lc,
map $chars[rand(@chars)],
1..42;
或者更好:
my @chars = ('0'..'9', 'a'..'z', 'A'..'Z');
my $passwd =
join '',
map $chars[rand(@chars)],
1..42;
答案 2 :(得分:5)
在提供大写和小写列表时,使用lc
和uc
没有任何意义,这很简单:
use strict;
use warnings;
sub random_pwd {
my $length = shift;
my @chars = (0 .. 9, 'a' .. 'z', 'A' .. 'Z');
return join '', @chars[ map rand @chars, 0 .. $length ];
}
print random_pwd(42);
如果您希望在现有字符串中随机化大写字母,可以采用以下方法:
$str =~ s/(\w)/ rand() < 0.5 ? uc($1) : lc($1) /ge;
使用[a-z]
代替\w
(其中还包括数字)更严格一些,但您丢失的只是一些冗余处理(例如uc("L")
或lc("2")
),这应该不是问题。
答案 3 :(得分:3)
您的代码将字符串'lc'或'uc'与随机字母连接在一起,而不是将lc或uc函数实际应用于随机字母。 (无论如何,你不能在Perl 5.16之前引用内置函数。)
答案 4 :(得分:2)
不是CPan wOndERFuL?
use Text::Capitalize;
print scramble_case "Isn't CPAN wonderful?";
答案 5 :(得分:1)
已经有几个很好的答案,我将再提出两个,一个看起来像你在思考,第二个使用CPAN
首先,以OP的方式:制作匿名子程序,返回其参数的uc
或lc
,然后在随机字符上随机调用一个或另一个。
#!/usr/bin/env perl
use strict;
use warnings;
my @a = (0 .. 9, 'a' .. 'z');
my @case = (sub{lc shift},sub{uc shift});
my $x = join '', map { $case[int rand(2)]->($a[int rand @a]) } 1 .. 42;
print "$x\n";
好的,现在你已经了解了函数调用。为了生成密码,我们快速查看CPAN并找到String::Random
。它允许您根据模式生成随机字符串。
#!/usr/bin/env perl
use strict;
use warnings;
use String::Random 'random_regex';
print random_regex('[a-zA-Z]{42}'), "\n";
我最后一次跑这是
LpvrMpylaaZTzmMbyBLiNQiwFZyKWWesVecvBWbLwu
答案 6 :(得分:-1)
您可以尝试类似以下的内容:
perl -le "print map { ('a'..'z', 'A'..'Z', '0'..'9')[rand 62] } 1..42"
SXQtgMmzL7hsF9EZ2p9DrGg8BudNh4QWkOQn6UurPk
perl -le "print map { ('a'..'z', 'A'..'Z', '0'..'9')[rand 62] } 1..42"
Rk6TJlBRkB3tS6fhmtXUNAmHSw04HNJTWCw2bhTcSl
对于Linux,您可以替换“with”和“with”。
来源 - catonmat.net