2009-05-15 2 views
3

У меня есть следующий сценарий Perl, который генерирует строку, основанную на номер:Как генерировать последовательности символов, такие как шестнадцатеричные с другой базой?

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

Что вы пытаетесь заставить его сделать? Что именно вы спрашиваете? Вы спрашиваете, как вы конвертируете radix или вы просите анализ этого 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

Sweet, это работает и делает именно то, что я хотел! – tbjers

+2

Я бы, вероятно, написал 'my @chars = map chr, 48..57, 97..122;' или 'my @chars = (0..9, 'a' .. 'z');', но каждому свое :) – ephemient