7.5. HEX-Escapes decodieren
Im Rahmen von URL-Codierungen werden Sonderzeichen hexadezimal codiert, d.h. z.B %7E. Die Dekodierung kann über Funktionen erfolgen, es reicht aber auch eine Substitution:

      $string =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/chr hex $1/ge;

Die Operatoren "hex" und "chr" rechnen zum einen den Wert von hexadezimal in dezimal um, bzw. wandeln das Zeichen gem. der ASCII-Tabelle um.

Der umgekehrte Weg geht natürlich auch:

        $charlist=q($&?{}/\[\]= /);
        ($string = $_ ) =~ s/([$charlist])/"%".sprintf("%x",ord($1))/ge;

Das Problem ist, dass es nur Operatoren zur Umwandlung von Strings in Integer gibt (hex, ord, oct). Die Rückumwandlung erfolgt deshalb über die Funktion sprintf.
Nocheinmal als komplettes Progamm:

#!/usr/bin/perl
while (<STDIN>) {
#    print "<<< $_";
    if ($_ =~ /%/) {
        ($string = $_ ) =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/chr hex $1/ge;
    } else {
        $charlist=q($&?{}/\[\]= /);
        ($string = $_ ) =~ s/([$charlist])/"%".sprintf("%x",ord($1))/ge;
    }
    print ">>> $string";
}