I'm trying to write a perl script that reads piped data, then prompts the user for input based on that data. The following script, prompt_for_action
, is what I am trying to do:
#!/usr/bin/perl
my @hosts = ();
while (<>) {
my $host = $_;
$host =~ s/\n//; # strip newlines
push(@hosts, $host);
}
for my $host (@hosts) {
print "Do you want to do x with $host ? y/n: ";
chomp(my $answer = <>);
print "You said `$answer`.\n";
}
but when I run it there is no waiting for user input, it just blows through without waiting for me to type:
$ echo "test1.example.com
> test2.example.com" | ./prompt_for_action
Do you want to do x with test1.example.com ? y/n: You said ``.
Do you want to do x with test2.example.com ? y/n: You said ``.
If I don't read my data from STDIN...
#!/usr/bin/perl
my @hosts = ('test1.example.com', 'test12.example.com');
for my $host (@hosts) {
print "Do you want to do x with $host ? y/n: ";
chomp(my $answer = <>);
print "You said `$answer`.\n";
}
then script works fine:
$ ./prompt_for_action
Do you want to do x with test1.example.com ? y/n: y
You said `y`.
Do you want to do x with test12.example.com ? y/n: n
You said `n`.
Is piping to STDIN and then prompting for user input possible? If so how?
As for non-Unix-y systems you can use the findConsole from Term::ReadLine, and then use its output like in mob's answer, e.g. instead of
/dev/tty
put in the output offindConsole
first element.Example on Windows:
outputs:
On Unix-y systems, you can open the
/dev/tty
pseudo-file for reading.Once you pipe something through STDIN, your former STDIN (keyboard input) is being replaced by the pipe. So I don't think this is possible.