{ my ( $re, %c2e, $num_ent ); INIT { %c2e = ( '&' => 'amp' , '>' => 'gt' , '<' => 'lt' , '"' => 'quot', "'" => 'apos', ); $re = qr/[^\n\r\t !\#\$%\(-;=?-~]/; $num_ent = sub { sprintf '#x%X', ord( $_[ 0 ] ) }; } sub encode_entities { my $string = shift; $string =~ s/($re)/sprintf '&%s;', $c2e{$1} || $num_ent->( $1 )/ge; return $string; } }