Страницы

Поиск по вопросам

воскресенье, 26 января 2020 г.

Как на Perl выполнять несколько команд одновременно

#perl


Поясняю:
print "Введите команду:\n";
chomp ($kom = >STDIN>);
if ($kom = <условие>)
{
   оператор 1;
   оператор 2;
}
else
{
   оператор 3;
}

И чтобы при выполнении любой ветки ветвления, скрипт продолжал ожидания ввода команды
и не дожидаясь завершения первой начинал выполнять условие второй? Спасибо.    


Ответы

Ответ 1



Можно запускать новый процесс для выполнения каждой введённой команды: while () { chomp(); next if $_ eq ''; last if $_ eq 'exit'; fork() and next; # тут обрабатываем введённую команду exit(); } Если по окончании цикла ввода надо дождаться окончания обработки всех введённых команд, можно сделать так: use POSIX ':sys_wait_h'; my %children; while () { chomp(); next if $_ eq ''; last if $_ eq 'exit'; my $pid = fork(); if ($pid) { $children{$pid} = 1; next; } # тут обрабатываем введённую команду exit(); } # ждём окончания всех процессов обработки while (keys(%children)) { for (keys(%children)) { my $ret = waitpid($_, WNOHANG); next unless $ret; delete($children{$_}) if $ret != -1; } }

Ответ 2



Почитай здесь: Мини экскурс в AnyEvent - пишем паука use AnyEvent; $| = 1; print "enter your name> "; my $name_ready = AnyEvent->condvar; my $wait_for_input = AnyEvent->io ( fh => \*STDIN, poll => "r", cb => sub { $name_ready->send (scalar ) } ); # делаем что нидь еще # теперь ждем и подставляем данные на входе my $name = $name_ready->recv; undef $wait_for_input; # watcher нам больше не нужен print "your name is $name\n"; use AnyEvent; как-то так https://gist.github.com/mishin/6449631 Всё, что вы хотели знать об AnyEvent, но боялись спросить

Комментариев нет:

Отправить комментарий