我有一个功能:
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
我有一个功能:
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
%%
在sprintf
格式字符串中用于打印百分号。
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 包的一部分,虽然不是核心,但它是许多其他模块所必需的,并且倾向于安装在大多数系统上。
只需%
将其翻倍即可逃脱。
( 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;
sub ascii_to_hex ($)
{
return join("", map { '%'.sprintf("%02x", ord($_)) } split(//, shift));
}