如何在Perl中将十六进制转换为字符字符串

6

我需要将%xx的十六进制字符转换为实际字符。我尝试使用以下代码,但它不能正常工作:

#!/usr/bin/perl -w

my $cadena = "%40%61%62";
print $cadena."\n";
$cadena =~ s/%//g;
print "cad: ".$cadena."\n";
my $string =~ s/([a-fA-F0-9][a-fA-F0-9])/chr(hex($1))/eg;
print "traducida: ".$string;

3
程序开头应该始终加上 use warningsuse strict,以确保程序严谨性和可读性。 - mkHun
好的,谢谢你的建议。我正在学习Perl,所有的建议都很好。 - Asier
1
提示:您可以使用s/([[:xdigit:]]{2})/chr(hex($1))/eg来避免冗长的类和冗余的代码。 - ikegami
2个回答

8

变更

my $string =~ s/([a-fA-F0-9][a-fA-F0-9])/chr(hex($1))/eg;

to

$cadena =~ s/([a-fA-F0-9][a-fA-F0-9])/chr(hex($1))/eg;

这样就可以在$cadena上进行搜索和替换。

输出结果:@ab

40 => @
61 => a
62 => b

非常感谢。有时我看不到最愚蠢的错误。 - Asier
2
@Asier:我们都会遇到这个问题。这就是为什么我们有use strictuse warnings的原因。 - Dave Cross

1
更好的正则表达式模式:
$cadena =~ s/([[:xdigit:]]{2})/chr(hex($1))/eg;

使用POSIX字符集[:xdigit:]来匹配单个十六进制字符,使用{2}来指定恰好两个这样的字符。

1
这个非答案很容易可以作为评论发布。 - ikegami
1
完全不需要:提示:您可以使用s/([[:xdigit:]]{2})/chr(hex($1))/eg来避免冗长的类和冗余的代码。 - ikegami
1
s///左侧的$cadena更改为my $string,这是修复错误的相反操作! - ikegami

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接