如何在Perl 5.8中增加十六进制字符串?

时间:2013-12-18 14:31:52

标签: perl hex perl5.8

我有一个大的十六进制数 - $num = 0x80000000,作为一个字符串。 我想增加它,但由于整数溢出(结果为负),执行hex($num)不起作用。使用bigint也不是一个选项,因为bigint仅在perl 5.10及更高版本中实现,我有5.8。我怎么能用这个字符串?

2 个答案:

答案 0 :(得分:5)

不要将文字表示与数字与实际值混淆。当你完成任务时,无论你如何表达它,Perl最终都会存储一个数字而不再关心原始表示。使用正常的数字操作。当您想再次查看它时,您可以选择您喜欢的任何表示形式:

$num = 0x8000000;
$num++;
printf "%0x" $num;

如果您将数字表示形式化为字符串,则只需要hex(),就像从命令行参数中获取一样。您只需要hex将字符串转换为数字。在那之后,它是一样的。

$num = hex( '8000000' );   # or hex( '0x8000000' )
# $num = hex( $ARGV[0] );
$num++;
printf "%0x" $num;

对于问题的其他部分,bignum在Perl v5.8上运行正常:

$ perl5.8.9 -le 'my $i = 0xFFFFFFFF_FFFFFFFF; $i++; print $i'
1.84467440737096e+19
$ perl5.8.9 -Mbignum -le 'my $i = 0xFFFFFFFF_FFFFFFFF; $i++; print $i'
18446744073709551616

答案 1 :(得分:0)

通过Perlbrew使用Perl 5.8.9我没有遇到任何问题:

#! /usr/bin/env perl
use strict;
use warnings;
my $num = 0x80000000;
print "$num\n";  # No quotes make this a number and not a string

这会打印出2147483648,这是0x8000000的十进制值。

你在哪个平台上?

您可能要做的是在 hex 中打印出这个十六进制数而不是十进制数。您仍然可以使用++递增它,但要以十六进制打印出来,您需要printf

#! /usr/bin/env perl
#
use strict;
use warnings;
use Data::Dumper;

my $num = 0x80000000;

for my $loop (0..100) {
    $num++;
    printf "%-20x\n",  $num;
}

打印出来:

80000001            
80000002            
80000003            
80000004            
80000005            
80000006            
80000007            
80000008            
80000009            
8000000a
...

如果确实0x80000000是一个字符串,使用Perl 5.8.9在我的系统上使用hex将它转换为数字没有问题。

#! /usr/bin/env perl
use strict;
use warnings;
my $num = "0x80000000";  # This is a string
$num = hex $num;         # Now it's a number

print "$num\n";          # Prints 2147483648 because `$num` is numeric

正如我所说。这是Perl 5.8.9(在Perlbrew上我得不到5.8.8),这是在Mac上。也许你的平台有点不同。它是具有32位版本的SunOS或Solaris的旧Solaris系统吗?

我已经检查了5.8.8文档,并注意到标准发行版内置了Bigint support。它也附带模块Math::Bigint

您确定没有Bigint支持吗?