Thanks for that, now I have another issue. Unlike a piped open, open 3 does not seem to produce output immediately
Is there any way to use pipes with open3 so that the FH has content before looping ie: this produces output my $pid=open($file, "-|","$cmd{$sopts->{subname}} 2>&1") while $pid=open3(undef,undef,$file,$cmdprog, @args) does not until you iterate over the FH thanks On 10 July 2017 at 07:13, Chas. Owens <chas.ow...@gmail.com> wrote: > On Sun, Jul 9, 2017, 19:37 Mike Martin <redt...@gmail.com> wrote: > >> Hi >> I am trying to use Open3 to capture stderr and avoiding the shell ie: >> my $str="-v 35 -i /data/Downloads/testinput.mp4 -c:v libx264 -preset fast >> -crf 28 -g 25 -c:a libmp3lame -b:a 128000 -threads 4 -af volume=2.5 -vf >> scale='352:trunc(ow/((1/sar)*dar)/2)*2',fps='fps= 20',setsar='1/1' >> -profile:a aac_he_v2 -strict -2 -y /home/mike/testopen.mp4"; >> use Text::ParseWords; >> @args = quotewords('\s+', "'", $str); >> >> use IPC::Open3; >> >> local(*HIS_IN, *HIS_OUT, *ERR); >> my $cmd='ffmpeg'; >> my $pid=open3(undef, undef, *ERR,$cmd, @args) or die print "$!"; >> my $line; >> >> while (sysread ERR, $line, 256){ >> print $line; >> } >> waitpid($pid, 0); >> >> However the output is buffered for around 2 minutes at a time rather >> immediately being printed >> >> Is there any way around this >> > > Are you certain the buffering is in the read from ERR and not in the > print? STDERR is not supposed to be buffered. Try adding > > $| = 1; > Near the top of your program. That will turn off any buffering of the Perl > 5 script's STDOUT. > > By default, Perl 5 will buffer STDOUT if it isn't writing to a > pseudoterminal (eg if you are piping the output of the Perl 5 script to > something else like tee.) > > >