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

I’ve been poring over IPC::Run documentation, have tried running several of the code samples in the docs, and am having no joy. I’m a Perl newbie, and I’m sure I’m doing something wrong. But 2 hours of poking and starting and Googleing haven't helped me. May I impose for a few quick questions?

From http://search.cpan.org/~rsod/IPC-Run-0.79/lib/IPC/Run.pm, I copied and ran (after adding the ‘use’ command) the following:

use IPC::Run qw (start pump finish ); ## Build the harness, open all pipes, and launch the subprocesses my $h = start \@cat, \$in, \$out, \$err ; $in = "first input\n" ; ## Now do I/O. start() does no I/O. pump $h while length $in ; ## Wait for all input to go ## Now do some more I/O. $in = "second input\n" ; pump $h until $out =~ /second input/ ; ## Clean up finish $h or die "cat returned $?" ;
When I execute this, I get a clean compile on Windows XP with the latest ActivePerl, but get this error at execution time:

Command '' not found in C:\Perl\bin\, C:\WINDOWS\system32, C:\WINDOWS, C:\WINDOWS\System32\Wbem, C:\Program Files\Common Files\Roxio Shared\DLLShared, C:\Program Files\Sonic\MyDVD, C:\Sun\AppServer\jdk\bin, C:\Program Files\Sonic\MyDVD at C:/Program Files/eclipse/workspace/Wizard/run.pl line 4

I can’t figure out what command it is looking for. At a high level I know that I need to feed the ‘start’ some command to run. But I didn’t see an example of how to do this. Do I place a command into the ‘@cat’ array? What would I use to make this example work on Windows XP?

Many thanks!

tl

2005-02-18 Janitored by Arunbear - added code tags, as per Monastery guidelines

Replies are listed 'Best First'.
Re: IPC::Run syntax question
by Corion (Patriarch) on Feb 13, 2005 at 20:38 UTC

    My version of IPC::Run (0.78) has the following example in the documentation:

    ## First,a command to run: my @cat = qw( cat ) ; ## Using run() instead of system(): use IPC::Run qw( run timeout ) ; run \@cmd, \$in, \$out, \$err, timeout( 10 ) or die "cat: $?" # Can do I/O to sub refs and filenames, too: run \@cmd, "in.txt", \&out, \&err or die "cat: $?" run \@cat, "in.txt", '>>', "out.txt", '2>>', "err.txt" ; # Redirecting using psuedo-terminals instad of pipes. run \@cat, '<pty<', \$in, '>pty>', \$out_and_err ;

    so, yes, @cat needs to be filled with the command and the arguments of the thing you want to run.

    But if you're trying some basic things, why dabble with IPC::Run if the plain system() call or backticks can do your work already? What do you want to do?

      Hi

      Thanks very much for the reply. Putting the command and its arguments into an array that becomes the first argument to 'run' is now obvious; thanks for pointing that out!

      I wish I could use something simpler than IPC::Run, but I don't think I can (please tell me I'm wrong).

      I need to run a program, and then do things with the program's output. So, system() (which doesn't allow this) isn't the right tool.

      Worse, I need to feed responses to the program as it runs. Backticks doesn't support this.

      I had initially looked at Open2(), but that didn't work on Windows XP. So, I'm trying IPC::Run, as it SEEMS to be the best solution.

      I'd very much value the opinion of others with more Perl experience than me (which, at this point, includes many house plants).

      Thanks! tl

        Greetings, esteemed monks!

        I assume you also looked into open3? _________________________________________________________________________________
        Without me, it's just aweso