我想在perl中执行以下操作:
@digits = ("1", "2", ..., "a", ... "z", ... ); ## a list of characters
$num = 1033;
convert_to_base($num, @digits);
现在,$ num将被转换为一个字符串,其中使用的数字来自数字(因此基数为$#digits + 1)。
可以通过迭代$ num来完成,取$ $数字的模数为$,然后除以达到0,但我想知道是否有任何内置函数在perl中执行此操作(或者是在perl中执行此操作的快速函数)。
答案 0 :(得分:1)
正如@Adam Katz 在他的回答中提到的那样,这样做的方法是使用 Math::Base::Convert。但是,您的问题是关于使用任意 基础。 CPAN pod 不是很清楚如何做,但实际上很简单:
use strict;
use Math::Base::Convert; # https://metacpan.org/pod/Math::Base::Convert
my $arb_enc = ['0'..'9', 'B'..'D', 'F'..'H', 'j'..'n', 'p'..'t', 'v'..'z', '*', '~'] ;
# ^^^^ note this is a array ref, which you can build with whatever characters you want
my $d_arbenc = new Math::Base::Convert('10', $arb_enc); # from decimal
my $arbenc_d = new Math::Base::Convert( $arb_enc, '10'); # to decimal
# test it like this:
foreach ( "1", "123", 62, 64, 255, 65535, 100, 10000, 1000000 ) {
my $status = eval { $d_arbenc->cnv($_) }; # if error, $status will be empty, and error message will be in $@
print "d_arbenc [$_] = [$status]\n";
}
foreach ( "BD3F", "jjjnnnppp", "333", "bad string" ) {
my $status = eval { $arbenc_d->cnv($_) }; # if error, $status will be empty, and error message will be in $@
print "arbenc_d [$_] = [$status]\n";
}
答案 1 :(得分:0)
按照Math::Base::Convert中的建议使用choroba's comment to the question:
#!/usr/bin/perl
use Math::Base::Convert "cnv";
my $num = 1033;
printf "%b", $num; # binary: 10000001001
printf "%o", $num; # octal: 2011
printf "%d", $num; # decimal: 1033
printf "%x", $num; # hexadecimal: 409
print cnv($num, 10, b64); # base64*: G9 (*: 0-9, A-Z, a-z, ., _)
print cnv($num, 10, b85); # base85*: CD (*: from RFC 1924)
print cnv($num, 10, ascii); # base96: *s
请注意,如果您需要将其解释为字符串,则可能需要执行例如
printf "%s", "" . cnv($num, 10, b85);
答案 2 :(得分:-1)
如果你刚刚进行了谷歌搜索,你会发现这个: How to convert decimal to hexidecimal in perl
可以肯定的是,你可以找出如何转换为oct,binary等等。