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.