• ベストアンサー

数字を文字列に変換し短縮化する

質問させて頂きます。 1234567 などの数字を f3ad5 などのようにa-zも交えて 文字列の短縮化をしたいのですがそのようなperl関数または式などありますでしょうか。 文字列を再び数字に戻せるよう、可逆性も考慮したものが理想です。 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • kumoz
  • ベストアンサー率64% (120/185)
回答No.4

0 から z までの 36 文字を1つの文字列変数に入れ、36 進数に変換するときに substr を、10 進数に戻すときに index を使えば一応はできます。しかし、この 方法では 13, 14 桁位までは問題ないですが、より大きな桁数では無理です。 use strict; my $base_str = "0123456789abcdefghijklmnopqrstuvwxyz"; my $base_36 = convert_36(1234567); print "$base_36\n"; my $base_10 = convert_10($base_36); print "$base_10\n"; sub convert_36 { my $number = shift; my @work; while ($number > 0) { unshift @work, substr($base_str, $number % 36, 1); $number = int($number / 36); } return join('', @work); } sub convert_10 { my @work = reverse split //, shift; my $number; foreach my $idx (0 .. $#work) { $number += index($base_str, $work[$idx]) * (36 ** $idx); } return $number; }

nerumako
質問者

お礼

13, 14 桁までは使わないので教えて頂いた方法で十分だと思います。 ご回答ありがとうございました。

その他の回答 (3)

  • t-okura
  • ベストアンサー率75% (253/335)
回答No.3

CPAN には、いろいろなモジュールがありますね。

参考URL:
http://search.cpan.org/~kwilliams/Math-BaseCalc-1.012/lib/Math/BaseCalc.pm
nerumako
質問者

補足

ご回答ありがとうございます。 できればモジュールはuseしたくないので、 PHPのbase_convert()のような関数、または簡潔なスクリプトはないでしょうか。 10進数を36進数に変換するのは容易なのですが 36進数を10進数に変換する方法がわかりません。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

BASE64 にすればもっと短くなると思う. 原理的には 94進までは可能だけど....

nerumako
質問者

補足

ご回答ありがとうございます。 36進数で良いのでもう少し軽い処理のものは無いでしょうか。

  • aigaion
  • ベストアンサー率47% (287/608)
回答No.1

10進数を16進数に変えるだけでもだいぶ短縮されると思いますよ http://mikeneko.creator.club.ne.jp/~lab/perl/numerical_transform/

nerumako
質問者

補足

早速ご回答いただきましてありがとうございます。 できればアルファベットはa-zまでを利用したいので36進数?を利用したいのですがperlでは36進数を扱う良い方法は手作り以外ないでしょうか。

関連するQ&A

専門家に質問してみよう