我有一个功能:
sub ascii_to_hex ($)
{
## Convert each ASCII character to a two-digit hex number.
(my $str = shift) =~ s/(.|\n)/sprintf("%02lx", ord .$1)/eg;
return $str;
}
我需要在每个数字前添加'%'。收到%68%75%44
答案 0 :(得分:11)
%%
在sprintf
格式字符串中用于打印百分号。
答案 1 :(得分:3)
CPAN解决方案:
use URI::Escape;
sub ascii_to_hex { return uri_escape(shift, "\x00-\xFF"); }
或者
use URI::Escape qw(%escapes);
sub ascii_to_hex {
(my $str = shift) =~ s/[\s\S]/$escapes{$1}/g;
return $str;
}
URI :: Escape是URI包的一部分,虽然不是Core,但它是许多其他模块所必需的,并且确实倾向于安装在大多数系统上。
答案 2 :(得分:0)
sub ascii_to_hex ($)
{
return join("", map { '%'.sprintf("%02x", ord($_)) } split(//, shift));
}
答案 3 :(得分:0)
简单地通过加倍%
来逃避它。
( my $str = shift ) =~ s/(.)/ sprintf "%%%02x", ord $1 /seg;
return $str;
但这肯定要快一点:
( my $str = unpack 'H*', shift ) =~ s/(..)/%$1/sg;
return $str;
顺便说一句,从5.14开始,你可以做到
return unpack('H*', shift) =~ s/(..)/%$1/sgr;