如何使用大写和小写字母以及数字填充数组?

时间:2014-11-22 02:04:19

标签: arrays perl data-structures

我正在尝试打印大写和小写字母字符的所有可能性,并在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; 
}

2 个答案:

答案 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 
}