2009-05-15 7 views
3

je le script Perl suivant qui génère une chaîne basée sur un nombre:Comment générer des séquences de caractères comme hexadécimal avec une base différente?

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"; 
} 

Quand je lance ce que je reçois la sortie suivante:

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

Qu'est-ce que je manque? Reconnaissant pour toute aide!

+0

Qu'essayez-vous de l'obtenir à faire? Que demandez-vous exactement? Demandez-vous comment vous convertissez radix ou demandez-vous une analyse de ce code perl? –

+0

J'essaye de créer quelque chose de similaire à Base64 mais avec la base de 36 dans ce cas, en utilisant la plage de caractères donnée dans @chars. – tbjers

Répondre

3

Essayez plutôt, il est un peu plus clair que le script que vous avez et convertit correctement à une base arbitraire:

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

Doux, cela fonctionne et fait exactement ce que je voulais qu'il fasse! – tbjers

+2

J'écrirais probablement 'my @chars = map chr, 48..57, 97..122;' ou 'my @chars = (0..9, 'a' .. 'z');', mais à chacun leur propre :) – ephemient