Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?

Re^2: why can't I just cat the file???

by halley (Prior)
on Feb 07, 2008 at 15:05 UTC ( #666805=note: print w/replies, xml ) Need Help??

in reply to Re: why can't I just cat the file???
in thread why can't I just cat the file???

I'd like to expand upon this correct answer. It seems like a really weird distinction if you aren't familiar with Perl's filter-writing magic.
while (<DATA>) { ... }
One might think that the above code is equivalent to this:
@foo = <DATA>; while (@foo) { ... }
In reality, due to Perl's magical way of helping you implement simple STDIN-to-STDOUT text file filters, the first snippet is rephrased internally to mean the following:
while (defined ($_ = readline(*DATA))) { ... }
Thus, while () isn't taking a list, or even what looks like a list. It's taking a condition, the condition being the successful ability to read a single line from a filehandle (and if successful, assigning the line to $_ for checks inside the loop).

[ e d @ h a l l e y . c c ]

Replies are listed 'Best First'.
Re^3: why can't I just cat the file???
by hpavc (Acolyte) on Feb 07, 2008 at 17:31 UTC
    wow, well done. thanks
Re^3: why can't I just cat the file???
by convenientstore (Pilgrim) on Feb 08, 2008 at 17:00 UTC
    Ed, this is excellent stuff,
    Your reply had me read frantically more on while and defined and I have now better understanding on true and defined(as well as while)
    Just a quick question though, how/where did you know that while is doing that internally?
    I cannot find any offical doc saying that's what it does. Your explanation helped me a lot but just wondering if I am not reading the right stuff or I am just not reading it carefully
      I agree it's one of those cases where Perl's magic is hard to document, since it's only found when you combine TWO features (looping and inputting), not just one (inputting or looping).

      There's a tiny mention of it in perlvar, but the real money is in perlop under the "I/O Operators."

      My favorite is to simply ask Perl what is going on under the covers with the B::Deparse module. The deparse module will then show you the loop that Perl wrote for you!

      $ perl -MO=Deparse -e"while(<>){'???'}" ------------------------------------ LINE: while (defined($_ = <ARGV>)) { '???'; }
      For kicks, you can deparse the script which Perl writes for you, when you use command options like -p or -n.
      $ perl -MO=Deparse -p -e"???" ------------------------------------ LINE: while (defined($_ = <ARGV>)) { '???'; } continue { print $_; }

      [ e d @ h a l l e y . c c ]

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://666805]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others perusing the Monastery: (6)
As of 2017-08-22 20:29 GMT
Find Nodes?
    Voting Booth?
    Who is your favorite scientist and why?

    Results (340 votes). Check out past polls.