use strict; use warnings; sub make_tr { my $from=quotemeta(shift); my $to =quotemeta(shift); (my $opts=shift || "")=~tr/cdsCDS/cdscds/d; my $tr=eval "sub { (defined \$_[0] ? \$_[0] : \$_)=~tr/$from/$to/$opts}"; die "$@" if $@; return $tr; } my $tr=make_tr('A-Z','a-z'); my $x="YaBaDaBaDo"; $tr->($x); print $x,"\n"; $_="FOO"; $tr->(); print; __END__ yabadabado foo