问题描述
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 )'"