$ perl -e'print 0' | perl -e'while ($line = <>) { print "\$line=<$line> \$line=<" . ($line ? "true" : "false") . "> defined=<" . (defined($line) ? "true" : "false") . ">\n"};' $line=<0> $line= defined= #### $ perl -e'print 0' | perl -e'while ($line = readline(*STDIN)) { print "\$line=<$line> \$line=<" . ($line ? "true" : "false") . "> defined=<" . (defined($line) ? "true" : "false") . ">\n"};' $line=<0> $line= defined= #### use strict; use warnings; #The following all output: # BEFORE # $line=<0> $line= defined= # AFTER # # while (my $line = readline(*STDIN)) { # while (my $line = ) { # while (my $line = <>) { # # but wrapping readline in a sub produces only # BEFORE # AFTER print "BEFORE\n"; while (my $line = wrapped_readline(\*STDIN)) { print "\$line=<$line> \$line=<" . ($line ? "true" : "false") . "> defined=<" . (defined($line) ? "true" : "false") . ">\n"; } print "AFTER\n"; sub wrapped_readline { my $fh = shift @_; my $sLine = readline($$fh); #print "wrapped_readline: <$sLine>\n"; return $sLine; }