Курс по Raku / Обекти, вход-изход и изключения / Вход и изход / Стартиране на външни програми 🆕
Прихващане на изхода
За да прочетете какво отпечатва външна програма, вместо да я оставите
да го изсипе на екрана, подайте :out при стартирането ѝ.
Върнатият Proc тогава има манипулатор .out, от
който можете да четете:
my $proc = run 'echo', 'hello', :out;
my $output = $proc.out.slurp(:close);
say $output.chomp; # hello:out пренасочва стандартния изход на програмата в
Proc. Манипулаторът .out работи като
манипулаторите на файлове от предишния раздел, а .slurp
прочита всичко от него наведнъж. Прислужникът :close е
удобно скъсяване: след четенето той затваря манипулатора вместо вас —
същото прибиране, което правехте изрично с .close върху
манипулатор на файл, — така че нищо не остава отворено. Накрая
.chomp премахва завършващия нов ред, който
echo добавя.
Същото работи и с shell, което е удобно за улавяне на
резултата от конвейер:
my $proc = shell 'echo hello | tr a-z A-Z', :out;
say $proc.out.slurp(:close).chomp; # HELLOМожете да уловите и потока за грешки с :err и съответния
манипулатор .err. Подаването и на :out, и на
:err държи двата потока разделени, всеки в свой
манипулатор, така че можете да ги четете поотделно:
my $proc = run 'sh', '-c', 'echo out-line; echo err-line >&2', :out, :err;
say 'stdout: ', $proc.out.slurp(:close).chomp; # stdout: out-line
say 'stderr: ', $proc.err.slurp(:close).chomp; # stderr: err-lineТук командата на обвивката отпечатва един ред в стандартния изход и
един в стандартната грешка (>&2 пренасочва натам).
Понеже поискахме и двата потока, .out и .err
ги държат независимо — нормалният изход на програмата никога не се
смесва с диагностиката ѝ.
Улавянето на изхода е начинът да използвате външна програма като градивен блок — изпълнете я, прочетете резултата ѝ и продължете с тези данни в собствената си програма.
Навигация в курса
← Тест — Стартиране на програми | Обектът Proc →
💪 Или преминете направо към упражненията в този
раздел.