2013-04-03 8 views

risposta

9

Questo codice mostra una funzione a2n che fa quello che avete bisogno

use strict; 
use warnings; 

printf "%2s = %d\n", $_, a2n($_) for qw/ A B C AA AB AC BA BB BC /; 

sub a2n { 
    my $n = 0; 
    $n = $n * 26 + $_ for map { ord($_) & 0x1F } split //, shift; 
    $n; 
} 

uscita

A = 1 
B = 2 
C = 3 
AA = 27 
AB = 28 
AC = 29 
BA = 53 
BB = 54 
BC = 55 

Un corrispondente n2a assomiglia a questo

sub n2a { 
    my ($n) = @_; 
    my @a; 
    while ($n > 0) { 
    unshift @a, ($n-1) % 26; 
    $n = int(($n-1)/26); #Edited for failing corner case 
    } 
    join '', map chr(ord('A') + $_), @a; 
} 
-1

Hai davvero bisogno di un modulo per questo?

my $n = 55; 
my $s = 'A'; 
$s++ while --$n; 
print "$s\n"; 
+0

ma questo sarebbe rompere se si fa '$ S-- mentre - $ n'. Finiresti con '-1' (un numero negativo) giusto? – chrsblck

+0

@chrsblck L'operatore di decremento automatico non è magico, ma solo l'operatore di incremento. Questo è documentato in perldoc perlop. – TLP

+0

@TLP esattamente il mio punto. – chrsblck

3

C'è un trucco carino con l'operatore ... Prova:

print join ",",("A".."ZZ"),"\n" 

o

my @a = ("A".."ZZ"); 
print $a[56],"\n"; 

Questo non è davvero un buon modo, se avete intenzione di salire nelle 100s di migliaia di elementi, però. Quindi è meglio fare i calcoli matematici (molto semplici) per te stesso di base.

6

Beh, Perl in grado di gestire le lettere in diverse categorie, che potrebbe soddisfare le vostre esigenze:

my @letters = 'A' .. 'BC'; # A B C ... Z AA AB AC etc. 

Poi si può semplicemente fare:

my $letter = $letter[$foo - 1]; # 1 -> A, 2 -> B ...