in reply to Re^3: how to read STDIN interactively
in thread how to read STDIN interactively

Okay, yes, I can see that's what it is doing - the second time it returns EOF.

But I don't understand why then, if I am reading a line at a time, ($/ = \n) I don't have to read twice - once to read the chunk, and once to read the newline.

Also, why doesn't it work in the case when I made $/ local and undefined it in its own namespace, and the other case where I set $/ back to a newline immediately after the read.

I agree, reading it in list context is the simplest way, but I'd like to understand what is going on.

Replies are listed 'Best First'.
Re^5: how to read STDIN interactively
by ikegami (Patriarch) on Feb 25, 2011 at 01:47 UTC

    The undef being returned isn't the value of $/, it's a signal that EOF was reached.

    Your are mistaken about the behaviour being different when $/ eq "\n". It doesn't matter what $/ is. If you only have one line, the second read will be undef.

    $ echo "abc" | perl -E'$/ = undef; say defined(<>)||0 for 1..2;' 1 0 $ echo "abc" | perl -E'$/ = "\n"; say defined(<>)||0 for 1..2;' 1 0

    You saw a difference in your tests because you passed two lines before EOF with $/ eq "\n", but only one line before EOF with !defined($/).

    By the way, relying on the user to close STDIN between inputs creates a stinky interface.

      It looks like I am lacking some needed basic prerequisite stuff to understand what you all are talking about. I'm gonna need to do some studying.

      thanks much.
        Think of what it takes to stop while (<>) (which is short for while (defined($_ = <>))).