package PerlIO::via::AnyCRLF;
sub PUSHED {
my ($class) = @_;
my $have_crlf;
return bless \$have_crlf, $class;
}
sub FILL {
my ($self, $fh) = @_;
binmode $fh, ":crlf" unless $$self;
$$self = 1;
my $len = read $fh, my $buf, 4096;
if (defined $buf) {
$buf =~ s/\r/\n/g;
}
return $len > 0 ? $buf : undef;
}
1;
####
#!/usr/bin/perl
use PerlIO::via::AnyCRLF;
open my $f, "<:via(AnyCRLF)", "le.txt" or die $!;
# debug
# print "layers before reading :", join(':',PerlIO::get_layers($f)), "\n"; # :unix:perlio:via
print while <$f>;
# print "layers after reading :", join(':',PerlIO::get_layers($f)), "\n"; # :unix:perlio:crlf:via
####
package PerlIO::via::AnyCRLF;
sub PUSHED {
my ($class) = @_;
my $fh_ref;
return bless \$fh_ref, $class;
}
sub FILL {
my ($self) = @_;
my $len = read $$self, my $buf, 4096;
if (defined $buf) {
$buf =~ s/\r/\n/g;
}
return $len > 0 ? $buf : undef;
}
sub OPEN {
my ($self, $path) = @_;
open $$self, "<:crlf", $path or die $!;
# debug
# print "AnyCRLF layers :", join(':',PerlIO::get_layers($$self)), "\n";
return 1;
}
1;