my %badchars; while (<>) { my @bad = ( /([^[:ascii:]])/g ); # find all bad characters if ( @bad ) { for my $badch ( @bad ) { $badchars{$badch}++; } my $badlist = join ' ', map { sprintf("%02x", ord{$_}) } @bad warn "line contains bad char(s) ($badlist): $_"; } } for my $badch ( sort keys %badchars ) { printf "%6d %02x %s\n", $badchars{$badch}, ord($badch), $badch; }