harangzsolt33 has asked for the wisdom of the Perl Monks concerning the following question:

Dear fellow Monks, I consider myself to be a beginner with perl. Recently I noticed a weird behaviour, and I want to understand why it is happening. When you do

 print <STDIN>;

you can press Enter, and stdin continues to collect data... but when you do this:

 my $L = <STDIN>; print $L;

when you press Enter, stdin will stop collecting, and you will only get ONE line. whereas in the former example, you can enter many lines of input even though the two examples are basically the same. So, I can see that the two codes do slightly different things, but I dont understand why. Can somebody please explain this mystery to me?

Replies are listed 'Best First'.
Re: Printing from stdin to stdout
by Athanasius (Archbishop) on Aug 26, 2019 at 02:48 UTC

    Hello harangzsolt33,

    Angle brackets around a filehandle are a special Perl construct for calling the built-in readline function, which (like most Perl functions) behaves differently according to the context in which it appears. From the documentation:

    In scalar context, each call reads and returns the next line until end-of-file is reached, whereupon the subsequent call returns undef. In list context, reads until end-of-file is reached and returns a list of lines.

    The line my $L = <STDIN>; supplies a scalar context, and so only one line is read since readline is called only once.

    By contrast, the line print <STDIN>; supplies a list context (see print), so multiple lines may be read in by a single call.

    Change your second example as follows: my @L = <STDIN>; print @L; and you will see the same behaviour as in the first example. On Windows (where ^Z signals end-of-file):

    12:31 >perl -wE "my @L = <STDIN>; print @L;" abc def ghi ^Z abc def ghi 12:31 >

    Hope that helps,

    Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

      Wow! That explains it. I didnt know that print creates a list context.

      Thank you very much for your quick answer on a Sunday evening!!

        Note that a simple way to force scalar context on anything is scalar, as in print scalar <STDIN>;.