我想编写一个perl脚本来解析其中包含大量64位整数的文本文件。所有整数都以十六进制编写。
我需要
<
,=
,>
)我需要使用32位perl,我不能使用任何CPAN /外部模块(脚本必须是可移植的)。
PS我的perl是5.8(这是将用于脚本的最小版本)
PPS bignum / bigint错误:
$ perl -e 'use bignum; $_=hex("0x0000123412345678")'
Integer overflow in hexadecimal number at -e line 1.
$ perl -e 'use bigint; $_=hex("0x0000123412345678")'
Integer overflow in hexadecimal number at -e line 1.
PPPS:此处没有from_hex
。
$ perl -e 'use Math::BigInt; $_=Math::BigInt->from_hex("0x0000123412345678");'
Can't locate object method "from_hex" via package "Math::BigInt" at -e line 1.
没有qw/hex/
:
$ perl -e 'use bigint qw/hex/; $_=hex("0x0000123412345678")'
unknown option hex at /usr/lib/perl5/5.8/bigint.pm line...
PPPPS:但是new()有效:
$ perl -e 'use Math::BigInt; $_=Math::BigInt->new("0x0000123412345678"); print $_->as_hex(),"\n";'
0x123412345678
答案 0 :(得分:10)
核心编译指示bigint将允许您透明地处理大于系统可支持的整数。 Math::BigInt核心库中有相关的函数可以转换为十六进制表示。
答案 1 :(得分:4)
Math::Int64可以访问本机有符号和无符号的64位数字。这肯定比可能的替代Math::BigInt更快。
它有十六进制转换例程,它会使比较运算符和算术运算符重载,因此它可以执行您要求的所有操作。
use Math::Int64 qw( hex_to_uint64 uint64_to_hex );
my $n1 = hex_to_uint64("200000000");
my $n2 = hex_to_uint64("300000000");
printf("n1 is %s equal to n2\n", $n1 == $n2 ? "" : "not");
printf("n1 is %s less than n2\n", $n1 < $n2 ? "" : "not");
printf("n1 is %s greater than n2\n", $n1 > $n2 ? "" : "not");
printf("0x%016s", uint64_to_hex($n2 - $n1));
输出:
n1 is not equal to n2
n1 is less than n2
n1 is not greater than n2
0x0000000100000000
使用CPAN或缺少CPAN不会影响脚本的可移植性。