4

重複の可能性:
Perlでbase36演算を実行するための最良の方法は何ですか?

こんにちは、perlスクリプトを使用して基数10から基数36への変換から数値を変換することは可能ですか?

ここに例があります:

base 10 - 1234567890123 and outcome
base 36 - FR5HUGNF
4

3 に答える 3

3

ソースコードを調べてみる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 );
}
于 2012-10-10T15:10:16.610 に答える
1

これを行うサブルーチンを書くのはとても簡単です。以下のコードは値のチェックを行わず、変換される数値が常に負でないことを前提としています

Perl のバージョンがキーワードをサポートするほど最新でない場合は、プログラムの先頭で変数としてstate宣言するだけです。$symbolsmy

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
于 2012-10-10T16:15:23.307 に答える