Могу ли я запросить ввод пользователя после чтения ввода данных на STDIN в Perl?
Я пытаюсь написать perl script, который считывает данные по каналам, затем запрашивает пользователя для ввода на основе этих данных. Следующие script, prompt_for_action
- это то, что я пытаюсь сделать:
#!/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";
}
но когда я его запускаю, нет ожиданий ввода пользователя, он просто пробивает, не дожидаясь, когда я наберу:
$ 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 ``.
Если я не читаю свои данные из 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";
}
тогда script отлично работает:
$ ./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`.
Возможен ли переход на STDIN, а затем запрос на ввод пользователя? Если да, то как?
Ответы
Ответ 1
В системах Unix-y вы можете открыть псевдо файл /dev/tty
для чтения.
while (<STDIN>) {
print "from STDIN: $_";
}
close STDIN;
# oops, need to read something from the console now
open TTY, '<', '/dev/tty';
print "Enter your age: ";
chomp($age = <TTY>);
close TTY;
print "You look good for $age years old.\n";
Ответ 2
Как только вы нанесете что-нибудь через STDIN, ваш прежний STDIN (ввод клавиатуры) заменяется трубой. Поэтому я не думаю, что это возможно.