- ベストアンサー
数字を文字列に変換し短縮化する
質問させて頂きます。 1234567 などの数字を f3ad5 などのようにa-zも交えて 文字列の短縮化をしたいのですがそのようなperl関数または式などありますでしょうか。 文字列を再び数字に戻せるよう、可逆性も考慮したものが理想です。 宜しくお願い致します。
- みんなの回答 (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; }
その他の回答 (3)
- t-okura
- ベストアンサー率75% (253/335)
CPAN には、いろいろなモジュールがありますね。
補足
ご回答ありがとうございます。 できればモジュールはuseしたくないので、 PHPのbase_convert()のような関数、または簡潔なスクリプトはないでしょうか。 10進数を36進数に変換するのは容易なのですが 36進数を10進数に変換する方法がわかりません。
- Tacosan
- ベストアンサー率23% (3656/15482)
BASE64 にすればもっと短くなると思う. 原理的には 94進までは可能だけど....
補足
ご回答ありがとうございます。 36進数で良いのでもう少し軽い処理のものは無いでしょうか。
- aigaion
- ベストアンサー率47% (287/608)
10進数を16進数に変えるだけでもだいぶ短縮されると思いますよ http://mikeneko.creator.club.ne.jp/~lab/perl/numerical_transform/
補足
早速ご回答いただきましてありがとうございます。 できればアルファベットはa-zまでを利用したいので36進数?を利用したいのですがperlでは36進数を扱う良い方法は手作り以外ないでしょうか。
お礼
13, 14 桁までは使わないので教えて頂いた方法で十分だと思います。 ご回答ありがとうございました。