http://www.perlmonks.org?node_id=1025683


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 ?

Replies are listed 'Best First'.
Re^3: <> oddity ?
by LanX (Saint) 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)

      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 :)
      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.