2

我正在尝试在我的 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";

任何提示?

4

7 回答 7

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";

如果您想制定lcuc明确流程的一部分,您可以执行以下操作:

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";
于 2012-01-16T21:25:09.730 回答
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;
于 2012-01-16T22:05:52.707 回答
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")or lc("2")),这应该不是问题。

于 2012-01-16T22:06:29.523 回答
3

您的代码将字符串“lc”或“uc”与随机字母连接在一起,而不是将 lc 或 uc 函数实际应用于随机字母。(无论如何,你不能引用 Perl 5.16 之前的内置函数。)

于 2012-01-16T21:54:46.053 回答
2

CPan 是不是很奇妙?

use Text::Capitalize;

print scramble_case "Isn't CPAN wonderful?";
于 2012-01-17T07:19:15.860 回答
1

已经有几个很好的答案了,我再介绍两个,一个看起来像你的想法,第二个使用 CPAN

首先,以 OP 的方式:创建匿名子例程,返回其参数的ucor 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
于 2012-01-18T01:19:11.957 回答
-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,您可以将 " 替换为 ' 和 ' 替换为 "。

来源 - catonmat.net

于 2012-01-17T20:16:16.493 回答