#!/usr/bin/perl use 5.010; use strict; use warnings; my $string = '?~#'; $string =~ s/([^^A-Za-z0-9\-_.!~*'()])/ sprintf "%%%0x", ord $1 /eg; say $string;