On Fri, 17 Aug 2001, Jay Strauss wrote:

> Thanks Jeff,
> 
> that worked like a charm.

That is an apt description.

>  An aside, I was using "strict".  But I can't use the line:
> 
> open( SCRIPTINPUT, "|ksh_script" ) or die "could not start ksh_script";
> 
> because "SCRIPTINPUT" is a bareword.  So instead I used "strict 'vars', and
> it worked.  But how would
> I define the above line if I wanted to continue with "strict"?

Unfortunately, I think the line that failed was 

 print STDOUT SCRIPTINPUT;

and if you look at the output closely, you will see why.  Perl is
interpreting the SCRIPTINPUT in this line as a bareword, and printing
"SCRIPTINPUT".  In fact, what is happening is that I put the pipe at the
wrong end of the "filename", and the SCRIPTINPUT filehandle is an output
pipe.  It seems to remain inactive until the close, when the output of the
script gets interleaved with the STDOUT of this process.  I don't think I
could have screwed up more cleverly.

Now while I could have sworn there was a way to dump an input filehandle
to an output filehandle succinctly, I cannot find it now.  Maybe this will
do:

  open( SCRIPTINPUT, "ksh_script |" )
      or die " could not open input pipe";
  print "This is the preamble:\n";
  print while <SCRIPTINPUT>;
  print "\nThis is the epilog.\n";
  close SCRIPTINPUT;

which passes one line at a time from the input to the output.  Or, if you
want to really crank up the efficiency, you can bypass line detection:

  $| = 1;  # force Perl buffers on STDOUT to be kept clear so we can
           # bypass them and insure that output gets interleaved properly
           # comment this out to see the difference
  open( SCRIPTINPUT, "ksh_script |" )
      or die " could not open input pipe";
  print "This is a preamble:\n"; # autoflushed after this statement
  while ( 1 ) {
    # grab a chunk directly from the system
    $main::chars = sysread SCRIPTINPUT, $main::buf, 32768;
    last if ( 0 == $main::chars );  # skip out if no chars read
    # dump it directly to STDOUT
    syswrite STDOUT, $main::buf, $main::chars;
  }
  # free to reset $|=0 at this point for perl output buffering
  print "\nThis is the epilog.\n";
  close SCRIPTINPUT;


> 
> Jay
> 
> ----- Original Message -----
> From: <[EMAIL PROTECTED]>
> To: <[EMAIL PROTECTED]>
> Sent: Thursday, August 16, 2001 8:46 PM
> Subject: Re: [vox-tech] Gotta question
> 
> 
> > On Thu, 16 Aug 2001, Sam Peterson wrote:
> >
> > > Set $| =1 at the beginning of the program.
> > >
> > > It forces flushing of the output buffers.
> >
> > But it doesn't prevent the backticks from collecting all of the output
> > from the script in RAM before passing it to the output buffers.
> >
> > Try this:
> >
> > open( SCRIPTINPUT, "|ksh_script" ) or die "could not start ksh_script";
> > printf STDOUT SCRIPTINPUT;
> > close SCRIPTINPUT;
> >
> > > At 04:42 PM 8/16/2001 -0500, Jay Strauss wrote:
> > >
> > > >Fancy this, I gotta new problem
> > > >
> > > >I'm calling a ksh script within my perl program.  The ksh script
> basically
> > > >dumps a ton (multiple Gb) of data to stdout.  I'd like my perl program
> to
> > > >dump it to stdout too.  But if I do a:
> > > >
> > > >print `ksh_script`;
> > > >
> > > >The data doesn't get written to stdout till the ksh script completes,
> as
> > > >opposed to if I execute the ksh
> > > >script from the cmd line like:
> > > >
> > > ># ksh_script > out
> > > >
> > > >If I call the ksh script within my perl program I figure if I have to
> dump
> > > >multiple Gb of data I'll run out of memory long before the ksh script
> > > >completes.  Is there a different way to call the ksh script from within
> perl
> > > >so that the output of the ksh goes straight to stdout?  So that I can
> do:
> > > >
> > > ># perl_script > out
> > > >
> > > >without the memory requirements
> > > >
> > > >Thanks
> > > >Jay
> > > >
> > > >Jay Strauss
> > > >[EMAIL PROTECTED]
> > > >
> > > >
> > > >_________________________________________________________
> > > >Do You Yahoo!?
> > > >Get your free @yahoo.com address at http://mail.yahoo.com
> > >
> > > Sam Peterson
> > > Hart Interdisciplinary Programs
> > > 2201 Hart Hall
> > > University of California, Davis
> > > One Shields Avenue
> > > Davis, California 95616
> > > (530) 752-9332
> > >
> >
> > --------------------------------------------------------------------------
> -
> > Jeff Newmiller                        The     .....       .....  Go
> Live...
> > DCN:<[EMAIL PROTECTED]>        Basics: ##.#.       ##.#.  Live
> Go...
> >                                       Live:   OO#.. Dead: OO#..  Playing
> > Research Engineer (Solar/Batteries            O.O#.       #.O#.  with
> > /Software/Embedded Controllers)               .OO#.       .OO#.
> rocks...2k
> > --------------------------------------------------------------------------
> -
> 
> 
> _________________________________________________________
> Do You Yahoo!?
> Get your free @yahoo.com address at http://mail.yahoo.com
> 

---------------------------------------------------------------------------
Jeff Newmiller                        The     .....       .....  Go Live...
DCN:<[EMAIL PROTECTED]>        Basics: ##.#.       ##.#.  Live Go...
                                      Live:   OO#.. Dead: OO#..  Playing
Research Engineer (Solar/Batteries            O.O#.       #.O#.  with
/Software/Embedded Controllers)               .OO#.       .OO#.  rocks...2k
---------------------------------------------------------------------------

Reply via email to