Cursus Raku / Objecten, in- en uitvoer en excepties / Invoer en uitvoer / Externe programma’s uitvoeren 🆕
Uitvoer opvangen
Om te lezen wat een extern programma afdrukt in plaats van het naar
het scherm te laten gaan, geef je :out mee bij het starten.
De teruggegeven Proc heeft dan een handle .out
waaruit je kunt lezen:
my $proc = run 'echo', 'hello', :out;
my $output = $proc.out.slurp(:close);
say $output.chomp; # hello:out leidt de standaarduitvoer van het programma de
Proc in. De handle .out werkt als de
bestandshandles uit de vorige sectie, en .slurp leest er in
één keer alles uit. Het bijwoord :close is een handige
afkorting: na het lezen sluit het de handle voor je — dezelfde opruiming
die je met .close op een bestandshandle expliciet deed —
zodat er niets open blijft staan. Ten slotte haalt .chomp
de afsluitende newline weg die echo toevoegt.
Hetzelfde werkt met shell, wat handig is om het
resultaat van een pipeline op te vangen:
my $proc = shell 'echo hello | tr a-z A-Z', :out;
say $proc.out.slurp(:close).chomp; # HELLOJe kunt ook de foutstroom opvangen, met :err en de
bijbehorende handle .err. Zowel :out als
:err meegeven houdt de twee stromen apart, elk in een eigen
handle, zodat je ze los kunt lezen:
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-lineHier drukt het shellcommando één regel naar de standaarduitvoer af en
één naar de standaardfout (>&2 leidt daarheen om).
Omdat we om beide stromen gevraagd hebben, bevatten .out en
.err ze onafhankelijk — de gewone uitvoer van het programma
raakt nooit vermengd met zijn diagnostiek.
Uitvoer opvangen is hoe je een extern programma als bouwsteen gebruikt — draai het, lees zijn resultaat, en ga met die gegevens verder in je eigen programma.
Cursusnavigatie
← Quiz — Programma’s uitvoeren | Het Proc-object →
💪 Of ga direct naar de oefeningen in deze
sectie.