my %fixes = ( "\x{00a9}" => '\\textcopyright', "\x{2010}" => '-', "\x{fffd}" => '\\,', "\x{03b4}" => '$\\delta$', "\x{00c5}" => '\\AA{}', ); my ($re) = map qr/$_/, join '|', map quotemeta, keys(%fixes); @ARGV = '-' if !@ARGV; for my $ARGV (@ARGV} { my $fh; if ($ARGV eq '-') { open($fh, '<&:encoding(UTF-8), *STDIN) or die "Can't dup STDIN: $!\n"); } else { open($fh, '<:encoding(UTF-8), $ARGV) or die "Can't open \"$ARGV\": $!\n"); } for (;;) { last if eof($fh); defined( my $line = <$fh> ) or die("Can't read from \"$ARGV\": $!\n"); $line =~ s/($re)/$fixes{$1}/g; print $line; } }