Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
PerlMonks  

Re: <> oddity ?

by pvaldes (Chaplain)
on Mar 27, 2013 at 11:11 UTC ( #1025680=note: print w/ replies, xml ) Need Help??


in reply to <> oddity ?

I'm just trying to understand why this code doesn't work and blocks... I'm blocked forever

Not, the program is not blocked, is simply waiting at the line 69 (my line = <>;) for your input. If you type something it continues. As expected.


Comment on Re: <> oddity ?
Re^2: <> oddity ?
by hdb (Prior) on Mar 27, 2013 at 11:32 UTC

    This is well spotted! If I modify my example to include this extra <>:

    while(<>) { print; } my $line = <>; print "END\n";

    then only

    perl stdin.pl stdin.pl

    waits for more input, while the other two versions finished immediately. That is still strange...

    UPDATE: I guess Perl will do unshift(@ARGV, '-') unless @ARGV; (copied from LanX above) and "re-open" STDIN because @ARGV was exhausted in the while loop already. When using pipes or redirections this logic will not be applied and <> will only return EOF or similar.

      It is explained in the post of Lanx

      In the first case the program is waiting for the user to type a value for the variable $line; in the second and third cases a default value is provided instead, $line = '-';

      > That is still strange...

      Is it really?

      I mean what is this code actually supposed to do?

      Let's say it clearly: Reading from an exhausted filehandle is nonsense!

      Just the fact that this filehandle is magic leads to undefined behavior, because interactice input can't be exhausted.

      Using either STDIN or ARGV here to is not only better, it explicitly demonstrates the intention of this line.

      Cheers Rolf

      ( addicted to the Perl Programming Language)

Re^2: <> oddity ?
by Krambambuli (Deacon) on Mar 27, 2013 at 11:34 UTC
    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 ?
      > 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://1025680]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others exploiting the Monastery: (9)
As of 2014-12-27 17:43 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

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





    Results (177 votes), past polls