Perl:正则表达式,将十进制更改为十六进制

问题描述

我有一个文件,其中许多小数都以类似的形式给出

Hello
hey
'37888' =>'A'
'37890' =>'B'
'37642' =>'C'

现在我已经尝试过了,

while (my $line = <$Log1>) {
    $line =~ s/'(\d+)'/(\hex(\d+))/g);    #Here I am getting error
    print $line;
    };
sub hex{
my $num = @_;
my $n= ("0x"."%x\n",$num);
return $n; 
};   

我认为(\ hex(\ d +))可以工作。有什么建议怎么做吗?

解决方法

您可以使用sprintf将十进制数字格式设置为十六进制,并将s///e一起使用来评估sprintf

use warnings;
use strict;

while (my $line = <DATA>) {
    $line =~ s/(\d+)/sprintf '0x%x',$1/eg;
    print $line;
}

__DATA__
Hello
Hey
'37888' =>'A'
'37890' =>'B'
'37642' =>'C'

输出:

Hello
Hey
'0x9400' =>'A'
'0x9402' =>'B'
'0x930a' =>'C'

此外,已经有内置的hex函数,这意味着您应该避免创建自己的名为hex的函数。

,

Perl的hex则相反。它将字符串解释为已经是数字的十六进制表示形式。

我为快速转换提供了一些shell别名:

$ grep alias ~/.bash_profile | grep 2[hdob]
alias d2h="perl -e 'printf qq|%X\n|,int( shift )'"
alias d2o="perl -e 'printf qq|%o\n|,int( shift )'"
alias d2b="perl -e 'printf qq|%b\n|,int( shift )'"
alias h2d="perl -e 'printf qq|%d\n|,hex( shift )'"
alias h2o="perl -e 'printf qq|%o\n|,hex( shift )'"
alias h2b="perl -e 'printf qq|%b\n|,hex( shift )'"
alias o2h="perl -e 'printf qq|%X\n|,oct( shift )'"
alias o2d="perl -e 'printf qq|%d\n|,oct( shift )'"
alias o2b="perl -e 'printf qq|%b\n|,oct( shift )'"
alias b2h="perl -e 'printf qq|%X\n|,oct( q(0b) . shift )'"
alias b2o="perl -e 'printf qq|%o\n|,oct( q(0b) . shift )'"
alias b2d="perl -e 'printf qq|%d\n|,oct( q(0b) . shift )'"