5

数字を文字に、またはその逆に変換する perl モジュールはありますか?

例えば

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

などなど。

4

4 に答える 4

9

このコードは、必要なことを行う関数a2nを示しています

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

出力

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

対応するn2aのはこんな感じ

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;
}
于 2013-04-03T15:47:58.853 に答える
6

まあ、Perl は範囲内の文字を処理できるので、ニーズに合うかもしれません:

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

次に、次のように簡単に実行できます。

my $letter = $letter[$foo - 1];   # 1 -> A, 2 -> B ...
于 2013-04-03T15:43:03.617 に答える
3

オペレーターにはかわいい裏技があり..ます。試す:

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

また

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

ただし、数十万の要素に到達する場合、これはあまり良い方法ではありません。次に、base-26 の計算 (非常に単純な計算) を自分で行う方が適切です。

于 2013-04-03T15:42:40.920 に答える
-1

これには本当にモジュールが必要ですか?

my $n = 55;
my $s = 'A';
$s++ while --$n;
print "$s\n";
于 2013-04-03T15:42:23.500 に答える