my %rot; @rot{'A'..'M'} = ('N'..'Z'); @rot{'N'..'Z'} = ('A'..'M'); @rot{'a'..'m'} = ('n'..'z'); @rot{'n'..'z'} = ('a'..'m'); my $chars_to_change = join('', map quotemeta, keys %rot); sub rot13dynre { local $_ = @_ ? $_[0] : $_; s/([$chars_to_change])/$rot{$1}/g; return $_; }