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";
}