## No Period in the char class! $STRING =~ s/([^a-zA-Z0-9_-])/lc sprintf(".%02x", ord($1))/eg; ## my encode $S =~ s/([^\w-])/sprintf".%02x",ord$1/eg; ## my decode $S =~ s/\.(..)/chr hex $1/eg;