use strict; my %iso_8859_1_accents = ( a => [ qw(à á â ã ä å À Á Â Ã Ä Å) ], c => [ qw(ç Ç) ], e => [ qw(è é ê ë È É Ê Ë) ], i => [ qw(ì í î ï Ì Í Î Ï) ], n => [ qw(ñ Ñ) ], o => [ qw(ò ó ô õ ö ø Ò Ó Ô Õ Ö Ø) ], u => [ qw(ù ú û ü Ù Ú Û Ü) ], y => [ qw(ý Ý) ], ); # build translation strings my (%in, %out); for my $letter ('a'..'z') { my $uletter = CORE::uc $letter; # translate non-accented letters $in{uc} .= $letter; $out{lc} .= $letter; $in{lc} .= $uletter; $out{uc} .= $uletter; if (my $ra_accented = $iso_8859_1_accents{$letter}) { my $in = join '', @$ra_accented; $in{lc} .= $in; $in{uc} .= $in; $out{lc} .= $letter x @$ra_accented; $out{uc} .= $uletter x @$ra_accented; } } # build translation subroutines for my $type (qw(lc uc)) { my $sub = qq! sub iso_8859_1_$type { (my \$s = shift) =~ tr/$in{$type}/$out{$type}/; \$s } !; eval $sub; }