我正在尝试打印大写和小写字母字符的所有可能性,并在Perl中为4位数字字符混合。有人可以帮助我,逻辑正在躲避我虚弱的心灵!
这是我的代码:
use Number::Nary;
my ($enc) = n_codec(join '', 0..9, 'A'..'Z', 'a'..'z');
for (my $n = 0, $str = $enc->($n); $str ne '00001' ; $n++, $str = $enc->($n)) {
print $str;
}
答案 0 :(得分:2)
这是一种非常简单的方法:
#!/usr/bin/env perl
use strict;
use warnings;
my @chars = (0..9, 'A'..'Z', 'a'..'z');
for my $a (@chars) {
for my $b (@chars) {
for my $c (@chars) {
for my $d (@chars) {
print join('', $a, $b, $c, $d) . "\n";
}
}
}
}
答案 1 :(得分:1)
这会按照你的要求行事。它使用自定义子例程inc_base_62
,它将1添加到由数字和大写和小写字母组成的基本62字符串。在以0000
开头的循环中使用此选项将创建最多zzzz
的所有可能值,然后在循环终止时循环回0000
。
请注意,有近1500万个这样的组合,打印所有这些值需要几分钟(请注意,Perl将处理一个包含1500万个四字符串的数组)。如果您想查看更易于管理的内容,请尝试从00
开始,这将只生成3,844个组合。
use strict;
use warnings;
my $s = '0000';
while () {
print "$s\n";
$s = inc_base_62($s);
last unless $s =~ /[^0]/;
}
sub inc_base_62 {
my @word = unpack '(A1)*', shift;
my %special = ( '9' => 'A', 'Z' => 'a', 'z' => '0' );
for ( reverse @word ) {
if ( exists $special{$_} ) {
$_ = $special{$_};
next if $_ eq '0';
}
else {
++$_;
}
last;
}
join '', @word
}