2016-12-26 21 views
3

Я пытался читать символы из $ * IN, включая контрольные символы. Однако, после ввода Control-D, кажется, что $ * IN становится нефункциональным. Как я могу снова открыть $ * IN для чтения?

To exit type 'exit' or '^D' 
> my $x=$*IN.getc    # entered "e" 
e 
e 
> say ($x=$*IN.getc).ord  # entered Ctrl-D 
10 
> $x=$*IN.getc    # nothing can be entered now 
(Any) 
> my $y=$*IN.getc 
(Any) 
> 

Спасибо за любую помощь.

ответ

3

Автоматическое закрытие потока stdin, когда пользователь нажимает Ctrl-D, не то, что Perl 6 делает на принимающей стороне потока - это то, что драйвер терминала Unix делает на его конец. Таким образом, у вас будет такая же проблема на всех других языках программирования.

Я не думаю, что вы можете попросить терминал повторно открыть поток stdin после его закрытия.

Однако, вы можете поручить терминалу временно отключить его поведение автоматической обработки управляющих символов, как Ctrl + D по умолчанию (так называемый «Cooked mode„), и вместо того, чтобы использовать“Raw режим», в котором персонаж СРВ будет быть переданным вашей программе как есть, между прочим. Затем ваша программа может решить, как интерпретировать этот символ.

Один из способов проинструктировать терминал для входа в необработанный режим, это API termios, привязки Perl 6, для которых предусмотрен модуль Term::termios. (Использование метода .makeraw, продемонстрированного в модуле README.)

+0

Отлично! Благодарю вас! Вы всегда были полезны! – lisprogtor

 Смежные вопросы

  • Нет связанных вопросов^_^