#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, но боялись спросить
Комментариев нет:
Отправить комментарий