dポイントプレゼントキャンペーン実施中!

質問させて頂きます。

1234567 などの数字を f3ad5 などのようにa-zも交えて
文字列の短縮化をしたいのですがそのようなperl関数または式などありますでしょうか。

文字列を再び数字に戻せるよう、可逆性も考慮したものが理想です。

宜しくお願い致します。

A 回答 (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;
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/07/24 23:26

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



参考URL:http://search.cpan.org/~kwilliams/Math-BaseCalc- …

この回答への補足

ご回答ありがとうございます。
できればモジュールはuseしたくないので、
PHPのbase_convert()のような関数、または簡潔なスクリプトはないでしょうか。

10進数を36進数に変換するのは容易なのですが
36進数を10進数に変換する方法がわかりません。

補足日時:2008/07/13 15:31
    • good
    • 0

BASE64 にすればもっと短くなると思う.


原理的には 94進までは可能だけど....

この回答への補足

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

補足日時:2008/07/13 07:12
    • good
    • 0

10進数を16進数に変えるだけでもだいぶ短縮されると思いますよ


http://mikeneko.creator.club.ne.jp/~lab/perl/num …

この回答への補足

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

補足日時:2008/07/12 20:40
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!