Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

Re^3: "defined" in while loop Edit | Delete | Quote | Reply | Private Reply

by ELISHEVA (Prior)
on Feb 17, 2009 at 00:34 UTC ( [id://744249]=note: print w/replies, xml ) Need Help??


in reply to Re^2: "defined" in while loop Edit | Delete | Quote | Reply | Private Reply
in thread "defined" in while loop Edit | Delete | Quote | Reply | Private Reply

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 $_=<> in defined($_ =<>)? Another convenience feature? And where else does this happen?

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 $_):

$ perl -e'print 0' | perl -e'while ($line = <>) { print "\$line=<$lin +e> \$line=<" . ($line ? "true" : "false") . "> defined=<" . (defined( +$line) ? "true" : "false") . ">\n"};' $line=<0> $line=<false> defined=<true>

It is also not anything special about the syntax $somevar = <> because I get the same result if I use readline(...):

$ 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>

Or is it? Could it be that both while($somevar = readline(...)) and while($somevar = <...>), 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,

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; }

Thanks in advance, beth

Update: refined question a bit; fixed error in sub of $_ with $line; added examples using readline and a sub wrapping readline.

Replies are listed 'Best First'.
Re^4: "defined" in while loop Edit | Delete | Quote | Reply | Private Reply
by ikegami (Patriarch) on Feb 22, 2009 at 23:55 UTC

    Another convenience feature?

    Yes. It rarely matters, since most uses of <>/readline are for reading newline-terminated lines, which are necessarily true.

    And where else does this happen?

    It depends on your perception of "this". Perl does many things implicitly, but none other exactly like this.

    It is also not anything special about the syntax $somevar = <> because I get the same result if I use readline(...)

    It's not specific to the symtax, it's specific to the operator. <> (when used to read from a file) and readline are the same operator.

    >perl -MO=Concise -e"my $fh; readline($fh)" ... 6 <1> readline[t2] vK/1 ->7 5 <0> padsv[$fh:1,2] ->6 -e syntax OK >perl -MO=Concise -e"my $fh; <$fh>" ... 6 <1> readline[t2] vK*/1 ->7 5 <0> padsv[$fh:1,2] s ->6 -e syntax OK

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://744249]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others rifling through the Monastery: (4)
As of 2024-03-19 05:13 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found