$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
Это успешно преобразует %25admin
в %admin
, что на самом деле является желаемым результатом. Но по какой-то неизвестной причине вы затем выполняете другую замену с пустым шаблоном:
$value =~ s///g;
Этот пустой шаблон имеет особое значение. From perldo c perlop :
Пустой шаблон //
Если ШАБЛОН оценивается как пустая строка, последний успешно совпавший обычный вместо этого используется выражение.
Последнее успешно сопоставленное регулярное выражение находится в строке выше, поэтому этот оператор по существу означает:
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])//g;
Это соответствует %admin
и приводит к min
.