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 <[email protected]> <[email protected]>
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
