重複の可能性:
Perlでbase36演算を実行するための最良の方法は何ですか?
こんにちは、perlスクリプトを使用して基数10から基数36への変換から数値を変換することは可能ですか?
ここに例があります:
base 10 - 1234567890123 and outcome
base 36 - FR5HUGNF
重複の可能性:
Perlでbase36演算を実行するための最良の方法は何ですか?
こんにちは、perlスクリプトを使用して基数10から基数36への変換から数値を変換することは可能ですか?
ここに例があります:
base 10 - 1234567890123 and outcome
base 36 - FR5HUGNF
ソースコードを調べてみるMath::Base36
と、変換がいかに簡単かがわかります。
sub encode_base36 {
my ( $number, $padlength ) = @_;
$padlength ||= 1;
die 'Invalid base10 number' if $number =~ m{\D};
die 'Invalid padding length' if $padlength =~ m{\D};
my $result = '';
while ( $number ) {
my $remainder = $number % 36;
$result .= $remainder <= 9 ? $remainder : chr( 55 + $remainder );
$number = int $number / 36;
}
return '0' x ( $padlength - length $result ) . reverse( $result );
}
これを行うサブルーチンを書くのはとても簡単です。以下のコードは値のチェックを行わず、変換される数値が常に負でないことを前提としています
Perl のバージョンがキーワードをサポートするほど最新でない場合は、プログラムの先頭で変数としてstate
宣言するだけです。$symbols
my
use strict;
use warnings;
use feature 'state';
print base36(1234567890123);
sub base36 {
my ($val) = @_;
state $symbols = join '', '0'..'9', 'A'..'Z';
my $b36 = '';
while ($val) {
$b36 = substr($symbols, $val % 36, 1) . $b36;
$val = int $val / 36;
}
return $b36 || '0';
}
出力
FR5HUGNF