微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 )'"

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。