How do I make the STDIN in the Array stop? (PERL) -
this question has answer here:
my @array not stop taking in stdin...
my @array = undef; while (@array = undef){ @array = <stdin>; (@array[x]=5){ @array = defined; } }
as clarified, limit stdin 5 lines
use warnings; use strict; use feature 'say'; @input; while (<stdin>) { chomp; push @input, $_; last if @input == 5; } @input; there other things comment on in posted code. while deal of cleared in detail in dave cross answer, i'd address business of context when reading filehandle.
the "diamond" operator <> context-aware. i/o operators (perlop)
if
<filehandle>used in context looking list, list comprising input lines returned, 1 line per list element. it's easy grow rather large data space way, use care.
in usual while loop <> in scalar context
while (my $line = <$fh>) and same while (<$fh>) since assigns $_ variable, scalar, default.
but if assign array, filehandle $fh file opened
my @lines = <$fh>; then <> operator works in list context. reads lines until sees eof (end-of-file), @ point returns lines, assigned @lines. remember each line has newline. can remove them
chomp @lines; since chomp works on list well.
with stdin raises issue when input comes keyboard, <> waits more input since eof isn't coming on own. given ctrl+d† on unixy systems (ctrl+z on windows).
so can, in principle, have @array = <stdin> , quit input ctrl+d may little awkward input expected keyboard, implies need line line processing. less unusual if stdin comes file,
script.pl < input.txt or pipe on command line
some command output | script.pl where eof (courtesy of eot).
but i'd still stick customary while when reading stdin, , process line line.
† ctrl+d how referred 1 types low-case d ctrl. note ctrl , c (labeled ctrl+c) entirely different; sends sigint signal, terminates whole program if not caught.
Comments
Post a Comment