Minor tweak to allow reading of a line containing "0" :
while (defined(my $line = <$in>)) {
chomp $line; # Zap trailing "\n" efficiently
print $out $line,"\r";
}
Not required:
#!/usr/bin/perl
use strict;
use warnings;
use autodie;
open my $out,'>:raw',"file.tmp";
print $out "a line\na second line\n0";
close $out;
open my $in,'<:raw',"file.tmp";
while (my $line=<$in>) {
chomp $line;
print "read: $line\n";
}
close $in;
>perl foo.pl
read: a line
read: a second line
read: 0
>
Any line but the last in a file always contains a trailing newline, so $line is guaranteed to be true for all but the last line, and reading empty lines and lines containing only "0" is no problem for all but the last line:
>perl -E '"0\n" and say "true"'
true
>perl -E '"\n" and say "true"'
true
>perl -E '"0" or say "false"'
false
> perl -E '"" or say "false"'
false
>perl -E 'undef or say "false"'
false
>
The last line WOULD BE a problem if perl would check for truth. But in the special case of readline a.k.a. <HANDLE>, it checks for definedness, not for truth. Quoting perlfunc:
readline EXPR
readline
Reads from the filehandle whose typeglob is contained in EXPR (or from *ARGV if EXPR is not provided). In scalar context, each call reads and returns the next line until end-of-file is reached, whereupon the subsequent call returns undef. [...]
This is the internal function implementing the <EXPR> operator, but you can use it directly.
[...]If either a readline expression or an explicit assignment of a readline expression to a scalar is used as a while/for condition, then the condition actually tests for definedness of the expression's value, not for its regular truth value.
(Emphasis mine)
Alexander
--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)
|