URI 解码时删除百分号

Percentage sign getting removed when URI decoding

我正在尝试用 Perl 解码 uri 编码的表单数据位(编码数据是 %25admin 应该 解码为 %admin)。我正在使用一些重复的、简单的正则表达式来做到这一点:

    $value =~ tr/+/ /;
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex())/eg;    
    $value =~ s///g;

这组正则表达式多年来一直为我服务,通常效果很好,但在这种情况下,它正在输出 min(解码字符串中缺少“%ad”,就好像它是一部分转义字符)。我错过了什么导致它将字符 %25ad 解释为单个转义字符而不是 %25 作为转义字符和 ad 独立于它?

$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex())/eg;    

这成功地将 %25admin 转换为 %admin 这实际上是您想要的结果。但是出于某种未知原因,您随后用空模式进行了另一个替换:

$value =~ s///g;

这个空图案有特殊的意义。来自 perldoc perlop:

The empty pattern //
If the PATTERN evaluates to the empty string, the last successfully matched regular expression is used instead.

最后成功匹配的正则表达式在上面一行,所以这条语句的本质意思是:

$value =~ s/%([a-fA-F0-9][a-fA-F0-9])//g;

这匹配 %admin 并导致 min