Как я могу автоматически очистить файл 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, который позволяет заново открыть открытый поток.