Как я могу автоматически очистить файл Perl 6?

Есть несколько ответов для Perl 6 в его дни Parrot, и они, кажется, не работают в настоящее время:

Это версия Rakudo 2017.04.3, построенная на версии MoarVM 2017.04-53-g66c6dda, реализующей Perl 6.c.

Ответ: Включает ли perl6 "автозапуск" по умолчанию? говорит, что он включен по умолчанию (но это был 2011 год).

Вот программа, с которой я играл:

$*ERR.say: "1. This is an error";
$*OUT.say: "2. This is standard out";

И его вывод, который является неудачным заказом:

2. This is standard out
1. This is an error

Так что, возможно, мне нужно включить его. Там как можно отключить автозапуск? который упоминает autoflush метод:

$*ERR.autoflush = True;
$*ERR.say: "1. This is an error";
$*OUT.say: "2. This is standard out";

Но это не работает:

Нет такого метода 'autoflush' для инвоканта типа 'IO::Handle'

Думаю, я мог бы подделать это сам, создав класс IO, который сбрасывается после каждого вывода. Что бы это ни стоило, это отсутствие этой функции, которая помешала мне использовать Perl 6 для конкретной задачи сегодня.

В качестве вторичного вопроса, почему Perl 6 не имеет этого сейчас, особенно когда он выглядит так, как раньше? Как бы вы убедили Perl 5 человек, это не проблема?

4 ответа

Решение

Возможно, это еще не сработало, когда вы задали вопрос, но:

$*ERR.out-buffer = False;
$*ERR.say: "1. This is an error";
$*OUT.say: "2. This is standard out";

Это немного трудно найти, но это задокументировано здесь.

У меня работает в Rakudo Star 2017.10.

Совсем недавно был выходной завод. С моей локальной версией rakudo я не могу заставить ее давать неправильный порядок (2017.06-173-ga209082 built on MoarVM version 2017.06-48-g4bc916e)

Там сейчас :buffer аргумент io обрабатывает, что вы можете установить число (или передать его как :!buffer) это будет контролировать

Я принимаю значение по умолчанию, если на выходе isatty это не буфер.

Rakudo не поддерживает автозапуск (пока). В 5to6-perlvar есть примечание $OUTPUT_AUTOFLUSH запись.

raiph опубликовал комментарий в другом месте с поиском в журнале IRC# perl6, показывающим, что люди продолжают рекомендовать автозапуск, а некоторые другие говорят, что он не реализован. Так как это не документированный метод (хотя flush есть), я полагаю, нам придется немного пожить без него.

Если вас в первую очередь интересуют STDOUT и STDERR, кажется, что следующее открывает их без буферизации (автоматическая очистка):

$*OUT = $*OUT.open(:!buffer);
$*ERR = $*ERR.open(:!buffer);

Это еще не полностью проверено, и я удивлен, что это работает. Это забавный API, который позволяет заново открыть открытый поток.

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