Rakudo Perl 6: очистить экран при использовании модуля Readline

Вот моя тестовая программа:

use Readline;

shell 'clear';
my $r = Readline.new;

loop {
  my $a = $r.readline("> ");
  {say ''; last} if not defined $a;
  $r.add-history( $a );
  say $a;
}

После того, как я ввожу любую строку, она выходит со следующим сообщением:

> abc
Internal error: unhandled encoding
  in method CALL-ME at /opt/rakudo-pkg/share/perl6/sources/24DD121B5B4774C04A7084827BFAD92199756E03 (NativeCall) line 587
  in method readline at /home/evb/.perl6/sources/D8BAC826F02BBAA2CCDEFC8B60D90C2AF8713C3F (Readline) line 1391
  in block <unit> at abc.p6 line 7

Если я прокомментирую строку shell 'clear';, все отлично.

1 ответ

Решение

Это немного догадка, но я думаю, когда вы говорите своей оболочке clear экран, это отправка управляющего символа или управляющей последовательности в качестве ввода в эмулятор терминала. Readline читает из того же потока, и эти символы заканчиваются в начале вашей "строки", когда вы пытаетесь прочитать строку. Эти символы не являются допустимыми UTF-8 (кодировка по умолчанию) и поэтому не могут быть интерпретированы как строка. Вы узнаете больше, если откроете текстовые файлы в трассировке стека и посмотрите соответствующие номера строк.

Вы можете попробовать позвонить reset-terminal или же reset-line-state чтобы увидеть, сможешь ли ты избавиться от этого персонажа. На низкоуровневом языке программирования я бы сделал неблокирующее чтение ввода (без преобразования его в строку), но я не могу найти API для этого в библиотеке Perl 6.

Другие вопросы по тегам