在Perl中对类似十六进制的字符串执行算术运算

时间:2014-05-30 00:57:25

标签: linux perl

我正在尝试编写一个perl one-liner,它接受两个类似十六进制的字符串(字符串看起来像十六进制,但没有前导0x)并在两个十六进制字符串上执行算术表达式。

例如。让我们说我正在从/ proc / PID / maps读取数据。第一列包含十六进制存储器的地址(不带前导0x)

bff45000-bff66000

是地址的一个例子。

我使用的perl单行是:

perl -le 'print" "x5,"Hex\t\tDecimal\n","-"x15," "x5,"-"x15;foreach $a(@ARGV){$b=eval($a);printf"0x%-10x %17d\n",$b,$b}'

我遇到的问题是perl会抛出这样的错误

Bareword found where operator expected at (eval 1) line 1, near...

这是因为Perl可以以“0x ... + 0x ...”的形式对十六进制字符串执行算术运算,而不是“.... + .....”

有人可以指出我正确的方向,我可以解决我的问题吗?

2 个答案:

答案 0 :(得分:2)

使用perl oneliner,为数字指定0x前缀,然后只使用eval

echo "bff45000-bff66000" | perl -lne 's/([[:xdigit:]]+)/0x$1/g; print eval'

输出:

-135168

答案 1 :(得分:0)

你想要输出十六进制吗?

echo deadbeef-c00cc00c | perl -lne 's/[[:xdigit:]]+/hex($&)/g;printf "%x",eval'