3

我有一个功能:

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

4

4 回答 4

11

%%sprintf格式字符串中用于打印百分号。

于 2012-08-21T12:53:04.747 回答
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 包的一部分,虽然不是核心,但它是许多其他模块所必需的,并且倾向于安装在大多数系统上。

于 2012-08-21T15:31:53.940 回答
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;
于 2012-11-16T01:42:06.873 回答
0
sub ascii_to_hex ($)
{
  return join("", map { '%'.sprintf("%02x", ord($_)) } split(//, shift));
}
于 2012-08-21T12:50:16.357 回答