2009-05-15 6 views
3

私は数に基づいて文字列を生成し、次のPerlスクリプトを持っている:16進数のような異なる文字列をどのように生成するのですか?

my @chars; 
push @chars, map(chr, 48..57), map(chr, 97..122); 
my $c = $#chars+1; 

for (0..50) { 
    my $string; 
    my $l = $_/$c; 
    my $i = int $l; 
    my $r = ($l - $i) * $c; 
    $string .= $chars[$r]; 
    while ($i > 0) { 
     $l = $i/$c; 
     $i = int $l; 
     $r = ($l - $i) * $c; 
     $string .= $chars[$r]; 
    } 
    print "$string\n"; 
} 

私はこれを実行すると、私は次のような出力が得られます。

0 
1 
2 
3 
4 
... 
z 
01 
01 
21 
21 
41 
41 
61 
61 
81 
91 
91 
b1 
b1 
d1 
d1 

私は何をしないのですか?何か助けてくれてありがとう!

+0

何あなたはそれが何を取得しようとしていますか?あなたは何を求めているのですか?基数をどのように変換するか、またはそのperlコードの分析を求めていますか? –

+0

私はBase64に似たものを作成しようとしていますが、この場合は36の基数を使って、@ charsで与えられた文字範囲を使用します。 – tbjers

答えて

3

それはあなたが持っているスクリプトよりも少し明確だし、適切に任意のベースに変換し、代わりにこれを試してみてください:

my @chars; 
push @chars, map(chr, 48..57), map(chr, 97..122); 

my $base = @chars; 

for my $num (0..100) { 
    my $string = ''; 

    while ($num >= $base) { 
     my $r = $num % $base; 
     $string .= $chars[$r]; 

     $num = int($num/$base); 
    } 
    $string .= $chars[$num]; 
    print reverse($string) . "\n"; 
} 
+0

甘い、これは動作し、私がそれがしたいと正確に何をしています! – tbjers

+2

私はおそらく 'my @chars = map chr、48..57、97..122;'または 'my @chars =(0..9、 'a' .. 'z');'と書くでしょう。それぞれ独自に :) – ephemient

関連する問題