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'

Attachment: signature.asc
Description: Digital signature

Reply via email to