use Carp; sub make_tr { my $from=quotemeta(shift); my $to =quotemeta(shift); my $opts=shift || ""; Carp::croak "Bad option in '$opts'" if $opts!~/[cds]/; my $eval_str="sub { (@_ ? \$_[0] : \$_)=~tr/$from/$to/$opts}"; my $tr=eval $eval_str; die "While evaling\n$eval_str\n$@" if $@; return $tr; }