jey
jey

Reputation: 21

How to send STDIN(multiple arguments) to external process and work within interactive mode

External program has interactive mode asking for some details. Each passed argument must be accepted by return key. So far I managed to pass an argument to external process however the problem I'm facing more then one argument is passed, perl executes then all when you close pipe. It's impractical in interactive modes when arguments are passed one by one.

#!/usr/bin/perl

use strict;
use warnings;

use IPC::Open2;

open(HANDLE, "|cmd|");
print HANDLE "time /T\n";
print HANDLE "date /T\n";
print HANDLE "dir\n";
close HANDLE;

Upvotes: 2

Views: 1267

Answers (1)

Schwern
Schwern

Reputation: 164639

Unfortunately you can't pass double pipes into open as one would like, and loading IPC::Open2 doesn't fix that. You have to use the open2 function exported by IPC::Open2.

use strict;
use warnings;

use IPC::Open2;
use IO::Handle;  # so we can call methods on filehandles

my $command = 'cat';
open2( my $out, my $in, $command ) or die "Can't open $command: $!";

# Set both filehandles to print immediately and not wait for a newline.
# Just a good idea to prevent hanging.
$out->autoflush(1);
$in->autoflush(1);

# Send lines to the command
print $in "Something\n";
print $in "Something else\n";

# Close input to the command so it knows nothing more is coming.
# If you don't do this, you risk hanging reading the output.
# The command thinks there could be more input and will not
# send an end-of-file.
close $in;

# Read all the output
print <$out>;

# Close the output so the command process shuts down
close $out;

This pattern works if all you have to do is send a command a bunch of lines and then read the output once. If you need to be interactive, it's very very easy for your program to hang waiting for output that is never coming. For interactive work, I would suggest IPC::Run. It's rather overpowered, but it will cover just about everything you might want to do with an external process.

Upvotes: 4

Related Questions