我正在尝试编写一个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 ...”的形式对十六进制字符串执行算术运算,而不是“.... + .....”
有人可以指出我正确的方向,我可以解决我的问题吗?
答案 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'