Курс по 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


💪 Или преминете направо към упражненията в този раздел.