For completeness sake...
I understand what each line does ... for example ...
performs transliteration on $value and thus translates characters like !, @, #, etc. to their hex equivalents ... that is, # becomes %23.
$value =~ tr/+/ /;
No, all it does is replace plus characters with spaces.
The line above then takes the two "hex" digits that make up the string and packs them into their hex equivalent.
$value =~ s/%(..)/pack("c", hex($1))/ge;
And this does the opposite of what you thought the first line does, i.e. it replaces things like %23 with # etc. (Perhaps that's what you were saying but I couldn't quite tell from your wording)