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

問題は、コードとして実行されると予想される文字列 (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

No sense in using lcand uc when providing a list of upper and lower case is as simple as it is:

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

If you however wish to randomize caps in an already existing string, here's one way:

$str =~ s/(\w)/ rand() < 0.5 ? uc($1) : lc($1) /ge;

Somewhat stricter is using [a-z] instead of \w (which also includes numbers), but all you are losing is some redundant processing (e.g. uc("L") or lc("2")), which should not be a problem.

于 2012-01-16T22:06:29.523 に答える
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 に答える
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

すでにいくつかの良い答えがあります。もう 2 つ紹介します。1 つはあなたが考えていたように見え、もう 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 に答える