On Aug 13, 10:47 pm, [EMAIL PROTECTED] (Chas Owens) wrote: > On 8/13/07, Jeff Pang <[EMAIL PROTECTED]> wrote: > > > > > -----Original Message----- > > >From: [EMAIL PROTECTED] > > >Sent: Aug 14, 2007 3:20 AM > > >To: [EMAIL PROTECTED] > > >Subject: piping and reading stdin > > > >I want to read from a pipe in my perl script invoked like: > > > >date | perl myperlscript.pl > > > >I understand that this puts the text outputted from the date program > > >into the stdin. How could I check the buffer contained by the stdin > > >without it blocking for you to input anything from the keyboard if > > >nothing was piped in to the command. > > > >my perlscript contains something like: > > > >#this part im unsure about so im using functions that dont exist > > >if(buffer_has_stuff_in_it(STDIN)){ > > > while(<STDIN>){ > > > print "$_\n"; > > > } > > >} > > >else{ > > > print "You didnt pipe anything into this program!\n"; > > >} > > > Hi, > > > You need an IO::Select object to be monitored,if it's timeouted,then die or > > exit. > > Just show my sample codes,hope this helps. > > > use strict; > > use IO::Select; > > > my $timeout=1; # wait for 1 second > > > open PIPE,'cat|' or die $!; # since 'cat' doesn't input anything,program > > would die after 1 sec. > > my $oldhd=select PIPE;$|++;select $oldhd; > > my $s = IO::Select->new(); > > $s->add(\*PIPE); > > if (my @ready = $s->can_read($timeout)) { > > my @content=<PIPE>; > > print @content; > > }else { > > die "no input\n"; > > } > > close PIPE; > > snip > > Another method is to use turn off blocking for STDIN. The following > code should be run like this > > perl script.pl send | perl script.pl > > #!/usr/bin/perl > > use strict; > use warnings; > use IO::File; > > if (defined $ARGV[0] and $ARGV[0] eq 'send') { > STDOUT->autoflush(1); > for my $i (1 .. 10) { > print "sending $i\n"; > sleep 3; > } > exit; > > } > > STDIN->blocking(0); > my $timeout = 10; > my $timer; > while (1) { > last if $timer++ > $timeout; > local $_ = <STDIN>; > if (defined) { > print; > $timer = 0; > } > sleep 1; > print localtime() ."\n"; > > }
Its not really making sense to me why you are adding sleep to this. Cant I do this as fast as possible? -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] http://learn.perl.org/