Beefy Boxes and Bandwidth Generously Provided by pair Networks
"be consistent"
 
PerlMonks  

Re^2: <> oddity ?

by Krambambuli (Deacon)
on Mar 27, 2013 at 11:34 UTC ( #1025683=note: print w/ replies, xml ) Need Help??


in reply to Re: <> oddity ?
in thread <> oddity ?

As expected... hmm. Define a sample.txt like

1 2 3
And then run $ test.pl sample.txt

where test.pl is
#!/usr/bin/perl use strict; use warnings; my $i = 0; while (<>) { print $_; last if ++$i >= 2; } my $line; print "My extra line: $line" while $line = <>;
Why would this program then NOT wait for any further input via STDIN ?


Comment on Re^2: <> oddity ?
Select or Download Code
Re^3: <> oddity ?
by LanX (Canon) on Mar 27, 2013 at 11:50 UTC
    > Why would this program then NOT wait for any further input via STDIN ?

    Perl can't read your mind, if you want to read from STDIN, explicitly use STDIN instead of stretching DWIM magic behavior till it breaks.

    UPDATE:

    actually your example is reading from STDIN, but maybe you should stop the redirecting from file to STDIN if you wanna read from interactive input (keyboard).

    see select

    Cheers Rolf

    ( addicted to the Perl Programming Language)

      OK, got it solved and understood now, thanks.

      I actually just want NOT to read from STDIN when there is a file given in the command line, and stop reading when that file is exhausted.

      Turns out that I should NOT any further $line = <> once that hit EOF, because the immediate next attempt to do so will just open STDIN.

      Ahaa... :)

      Thank you.
      Just to clarify:

      wishing to deal with various use modes in a perfectly similar manner, I wanted to have 3 distinct modes of calling the program behaving absolutely similar, with minimum fuss about that in the code:

      $ test.pl sample.txt sample1.txt ... sampleN.txt
      $ test.pl <sample.txt
      $ cat sample.txt sample1.txt ... sampleN.txt | test.pl

      All is well with this with the use of <>, except the fact that once EOF is seen, no further attempt to read from <> is allowed - or STDIN is opened, and will wait forever if you're unaware of it...

      Thanks you helping to sort this out.

      UPDATE As perlop says in 'I/O Operators':

      The <> symbol will return "undef" for end-of-file only once. If you call it again after this, it will assume you are processing another @ARGV list, and if you haven't set @ARGV, will read input from STDIN.

      Now I know :)

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others browsing the Monastery: (16)
As of 2014-12-18 15:46 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    Is guessing a good strategy for surviving in the IT business?





    Results (58 votes), past polls