>perl -wMstrict -le "my @ranges = ([33..42], [43..52], [53..62], [63..126]); ;; my $chars = join '', map { map chr, @$_ } @ranges; $chars =~ s{\\}'\\\\'xms; $chars =~ s{/}'\/'xms; ;; my $bins = join '', map { $_ x @{$ranges[$_]} } 0 .. $#ranges - 1; $bins .= $#ranges; ;; print qq{'$chars'}; print qq{'$bins'}; ;; eval qq{ sub binned { (my \$t = \$_[0]) =~ y/$chars/$bins/; return \$t; } }; ;; my $test = qq[!\x22 )#+, 3456 =>?@ }~]; print qq{test string: '$test'}; printf qq{tr// method: '%s' \n}, binned($test); ;; ;; my %xlate = map { my $i = $_; map { chr() => $i } @{$ranges[$_]} } 0 .. $#ranges ; ;; $test =~ s{(.)}{ exists $xlate{$1} ? $xlate{$1} : $1 }xmsge; print qq{s/// method: '$test'}; " '!"#$%&'()*+,-.\/0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~' '0000000000111111111122222222223' test string: '!" )#+, 3456 =>?@ }~' tr// method: '00 0011 1122 2233 33' s/// method: '00 0011 1122 2233 33'