Size: a a a

2020 December 19

VG

Vadim Goncharov in use Perl or die;
там чтоб tab completion работал, впилен здоровенный костыль с опросом раз в 40 мс =)
источник

VG

Vadim Goncharov in use Perl or die;
Алексей Клименко
В смысле никак, а это

 my $wait_for_input = AnyEvent->io (
     fh   => \*STDIN, # which file handle to check
     poll => "r",     # which event to wait for ("r"ead data)
     cb   => sub {    # what callback to execute
        $name = <STDIN>; # read it
     }
  );

и это

  my $hdl; $hdl = new AnyEvent::Handle
     fh => \*STDIN,
     on_error => sub {
        my ($hdl, $fatal, $msg) = @_;
        AE::log error => $msg;
        $hdl->destroy;
        $cv->send;
     };

!?
а это не работает у тех, у кого винда вместо операционной системы
источник

АК

Алексей Клименко... in use Perl or die;
Хорошо, у перла есть что-то типа finally для всей программы, OnExit какой-нибудь?

(Сча, небось, если и есть – то с асинхронностью не дружит).

О а ещё на винде можно сказать «иди нафиг» тому, кто пытается тебя закрыть – и даже консольное окно не закроется, лишь предложит убить процесс через несколько секунд.

В перле так можно? Мне бы подошло.
источник

VG

Vadim Goncharov in use Perl or die;
возможно, есть интерфейс для atexit(3), я не проверял, работает ли оно под виндой
источник

VG

Vadim Goncharov in use Perl or die;
еще можно low-level покодить через use Win32::* если время девать некуда =)
источник

АК

Алексей Клименко... in use Perl or die;
Тогда я кроссплатформенность с линуксом же потеряю почём зря.
источник

VG

Vadim Goncharov in use Perl or die;
нет, если оборачивать в if-ы по $^O
источник

a

allter in use Perl or die;
Алексей Клименко
Хорошо, у перла есть что-то типа finally для всей программы, OnExit какой-нибудь?

(Сча, небось, если и есть – то с асинхронностью не дружит).

О а ещё на винде можно сказать «иди нафиг» тому, кто пытается тебя закрыть – и даже консольное окно не закроется, лишь предложит убить процесс через несколько секунд.

В перле так можно? Мне бы подошло.
"finally": $SIG{__DIE__} либо END { xxx } блоки
блокировка прервывания: $SIG{INT} = 'IGNORE'} , но это под UN*X :)
источник

АК

Алексей Клименко... in use Perl or die;
Алексей Клименко
my $cond = AnyEvent->condvar;
my $signal = AnyEvent->signal( signal => 'INT', cb => sub {
 say "INT recvd";
 $cond->send;
});
$cond->recv;


– Это под Windows вообще не будет работать?
Просто если это убрать, то после нажатия Ctrl+C в консоли я получаю «Terminating on signal SIGINT(2)», а если поставить это – то Ctrl+C просто игнорируется и ничего не происходит.

Или я что-то не так написал?
Вот здесь заменил блок с $signal на

END{
 say 'END';
 $cond->send;
};


По Ctrl+C умерло и не выполнило ничего.
источник

VG

Vadim Goncharov in use Perl or die;
конечно, такую глупость писать
источник

АК

Алексей Клименко... in use Perl or die;
источник

VG

Vadim Goncharov in use Perl or die;
man perlmod про END читать надо
источник

a

allter in use Perl or die;
Алексей Клименко
Вот здесь заменил блок с $signal на

END{
 say 'END';
 $cond->send;
};


По Ctrl+C умерло и не выполнило ничего.
В END нужно что-то типа подчисток делать, там уже бесполезно какую-то логику размещать.
А вот в SIG{INT} можно попробовать, например. Но я подозреваю, что лучше предыдущих вариантов не будет. В винде надо GUI тулкит использовать и вешать хук на GUI события.
источник

АК

Алексей Клименко... in use Perl or die;
Почему GUI, у меня ж консольное приложение.
источник

a

allter in use Perl or die;
Алексей Клименко
Почему GUI, у меня ж консольное приложение.
потому что под виндой в "консоли" принято страдать.
источник

VG

Vadim Goncharov in use Perl or die;
там и без консоли полно мест страданий
источник

VG

Vadim Goncharov in use Perl or die;
виндовый select() умеет максимум 64 и то сокетов только, WaitForMultipleObjects() всего лишь в 2 раза больше
источник

ПК

Павел Колганов ☭... in use Perl or die;
allter
потому что под виндой в "консоли" принято страдать.
WSL немного облегчает страдания.
источник

a

allter in use Perl or die;
Павел Колганов ☭
WSL немного облегчает страдания.
Я вот только не уверен, что тот "терминал", который в 10ке, нормально работает с Ctrl+C и т.п.
источник

ПК

Павел Колганов ☭... in use Perl or die;
allter
Я вот только не уверен, что тот "терминал", который в 10ке, нормально работает с Ctrl+C и т.п.
Есть одна программулинка чисто под винду (требование такое было - писать под винду, WSL тогда не было), в которой ctrl+c обрабатывается. И работает ж.
Проверил, работает: perl -E "$SIG{INT} = sub { say 123; exit; }; sleep(1) for (1..10);"
источник