note
ELISHEVA
Thanks! Learn something every day! (well, lots today). But what is going on here? What (under the covers) makes this a special case? Why is Perl wrapping <code>$_=<></code> in <code>defined($_ =<>)</code>? Another convenience feature? And where else does this happen?
<p>Here's my output with a slightly expanded print line checking both the value and the defined status and just to make sure there was no monkey business with the special variable $_ I changed it to $line - same result as you, of course. (I had to switch " and ' to keep the bash shell from trying to resolve $_):</p>
<code>
$ perl -e'print 0' | perl -e'while ($line = <>) { print "\$line=<$line> \$line=<" . ($line ? "true" : "false") . "> defined=<" . (defined($line) ? "true" : "false") . ">\n"};'
$line=<0> $line=<false> defined=<true>
</code>
<p>It is also not anything special about the syntax <code>$somevar = <></code> because I get the same result if I use <code>readline(...)</code>:</p>
<code>
$ 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=<false> defined=<true>
</code>
<p>Or is it? Could it be that <i>both</i> <code>while($somevar = readline(...))</code> and <code>while($somevar = <...>)</code>, but only these, have special semantics? I noticed that if I wrap readline in a function of my own that the special behavior goes away. For example,
<code>
use strict;
use warnings;
#The following all output:
# BEFORE
# $line=<0> $line=<false> defined=<true>
# AFTER
#
# while (my $line = readline(*STDIN)) {
# while (my $line = <STDIN>) {
# 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;
}
</code>
<p>Thanks in advance, beth</p>
<p><b>Update:</b> refined question a bit; fixed error in sub of $_ with $line; added examples using readline and a sub wrapping readline.</p>
744123
744240