use strict; my $line = '$x += 2; $y = $x**2'; $line =~ s/([^\sa-zA-Z0-9])/'&#'.ord($1).';'/ge; # or if you don't want to encode underscores $line =~ s/([^\s\w])/'&#'.ord($1).';'/ge; print "$line\n"; #### s/([^ a-zA-Z0-9])/'&#'.ord($1).';'/ge # a single, literal space