- ベストアンサー
Math::BaseCalc モジュールを使った数字のアルファベット変換
- PerlのMath::BaseCalcモジュールを使用して、10進数をアルファベットに変換する方法について尋ねています。
- 現在のモジュールでは26 -> BAのように変換されますが、26 -> AAのように変換する方法はあるのでしょうか。
- AからZまでの組み合わせでできる文字列を順番に取得したいという要望です。拙作のサブルーチンを使用していますが、定番のモジュールがあれば教えて欲しいということです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
以下のような処理ではどうでしょうか? 例えば、4桁の場合、36進数を「YYZ0」からスタートすると、 YYZ0 YYZ1 … YYZY YYZZ YZ00 YZ01 … YZZY YZZZ Z000 Z001 … という数列になりますので、冒頭の/Y*Z/を削除することで、 0,1,…Y,Z,00,01,…,ZY,ZZ,000,001,… という数列が得られます。 #! /usr/local/bin/perl use strict; use Math::BaseCalc; my $digits=5; my $bc = Math::BaseCalc->new(digits=>['0'..'9','A'..'Z']); my $base = $bc->digits; my $offsetstr = $bc->to_base($base-2)x($digits-2).$bc->to_base($base-1).$bc->to_ base(0); my $laststr = $bc->to_base($base-1)x$digits; my $stripre = '^'.$bc->to_base($base-2).'*'.$bc->to_base($base-1); print "start = $offsetstr, end =$laststr, re = s/$stripre//\n"; my $offset = $bc->from_base($offsetstr); my $size = $bc->from_base($laststr); for (my $i = 0; $i <= $size; $i++) { my $str = $bc->to_base($i+$offset); my $result = $str; $result =~ s/$stripre//; print "$i: $str -> $result\n"; }
お礼
そのような方法があるとは、全く夢にも思いませんでした。 早速取り入れたいと思います。 実は以前にも似たような意図の質問をしたのですが、 http://okwave.jp/qa3847393.html 焦って解決してしまったために後悔しておりました。 下手な質問にもかかわらず、ご丁寧な回答を頂きまして心より感謝申し上げます。 ご回答有難うございました。 ---------- #!/usr/bin/perl use strict; use warnings; use utf8; use feature qw(:5.10); use Encode qw(encode_utf8); use Math::BaseCalc; my @digits = qw(あ い う え お); my $digits = @digits; my $basecalc = Math::BaseCalc -> new( digits => [@digits], ); my $i; my $j; my $k; my $l; # 1 桁から 5 桁まで for ($i = 1; $i <= 5; $i ++) { $k = $digits ** $i; $l = $k * 2; for ($j = $k; $j < $l; $j ++) { say encode_utf8 substr $basecalc -> to_base($j), 1; } }