2014-11-22 160 views
0

我試圖在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; 
} 
+1

你是什麼意思,不工作?你發佈的代碼工作正常 – ikegami 2014-11-22 02:50:03

+0

這就是說,我同意代碼是可怕的。你應該把它帶到代碼審查姊妹網站。你使用過'$ c = join',',a..z,A..Z,0..9; @loadarray = glob「{$ c}」x 1;'而不是子集'@loadarray =(a..z,A..Z,0..9);'幾乎不能抓表面。 – ikegami 2014-11-22 02:50:50

回答

1

,你問這個就行了。它使用一個自定義的子程序inc_base_62,它將1加到由數字和大寫和小寫字母組成的基數62字符串中。在以0000開頭的循環中使用它將創建所有可能的值,最大值爲zzzz,然後在循環終止時循環回0000

請注意,將近有一千五百萬個這樣的組合,打印所有這些值需要花費幾分鐘的時間(請注意,Perl將會處理一千五百萬個四字符串的數組)。如果你想檢查更易於管理的東西,那麼嘗試從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 
} 
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"; 
     } 
    } 
    } 
} 
相關問題