On Sat, Mar 14, 2015 at 03:20:06AM -0700, Charles DeRykus wrote: > open my $fh, '<:encoding.... ) or die ... > > { open( local *STDERR,'>',\my $err); > my $string = <$fh>; > if ($err =~ /does not map to Unicode/) { > # take action..... > } > }
Here is an alternative approach.. use strict; use warnings; use Encode qw/decode encode/; my $file_name = './somefile'; sub create_file { open my $fh, '>', $file_name or die "open: $!"; print $fh "ABC\n", chr(0x90), "\nDEF\n"; close $fh or warn "close: $!"; } sub read_or_die { my ($fh) = @_; my $bytes = <$fh>; # Emphasis on the Encode::FB_CROAK. my $string = decode('UTF-8', $bytes, Encode::FB_CROAK()); return $string; } sub write_or_die { my ($fh, $string) = @_; # Emphasis on the Encode::FB_CROAK. my $bytes = encode('UTF-8', $string, Encode::FB_CROAK()); print $fh $bytes; } create_file(); print STDERR "Created file. Attempting to open it...\n"; open my $fh, '<', $file_name or die "open: $!"; print STDERR "Attempting to read it...\n"; eval { while(my $line = read_or_die($fh)) { write_or_die(\*STDOUT, $line); } }; if ($@) { print "CAUGHT ERROR: $@"; } close $fh or warn "close: $!"; __END__ Output: Created file. Attempting to open it... Attempting to read it... ABC CAUGHT ERROR: utf8 "\x90" does not map to Unicode at /home/bambams/perl5/perlbrew/perls/stable/lib/5.18.0/x86_64-linux/Encode.pm line 176, <$fh> line 2. It is a bit more painful having to call decode and encode ourselves, but I couldn't figure out any way to control the CHECK parameter used by PerlIO. The weird thing is that the documentation appears to assert that PerlIO is supposed to be using Encode::FB_CROAK() (1) too, but alas I guess that isn't the case if it doesn't croak().. That or the PerlIO layers are catching and handling the error differently... Regards, -- Brandon McCaig <bamcc...@gmail.com> <bamcc...@castopulence.org> Castopulence Software <https://www.castopulence.org/> Blog <http://www.bambams.ca/> perl -E '$_=q{V zrna gur orfg jvgu jung V fnl. }. q{Vg qbrfa'\''g nyjnlf fbhaq gung jnl.}; tr/A-Ma-mN-Zn-z/N-Zn-zA-Ma-m/;say'
signature.asc
Description: Digital signature