Raku kurss / Objekti, ievade/izvade un izņēmumi / Ievade un izvade / Ārējo programmu palaišana 🆕

Izvades pārtveršana

Lai nolasītu to, ko ārēja programma izdrukā, nevis ļautu tam aiziet uz ekrānu, palaižot padodiet :out. Atgrieztajam Proc tad ir turis .out, no kura var lasīt:

my $proc = run 'echo', 'hello', :out;
my $output = $proc.out.slurp(:close);
say $output.chomp; # hello

:out novirza programmas standarta izvadi Proc iekšienē. Turis .out darbojas kā failu turi no iepriekšējās sadaļas, un .slurp no tā uzreiz nolasa visu. Apstākļvārds :close ir ērts saīsinājums: pēc nolasīšanas tas aizver turi jūsu vietā — tā pati sakopšana, ko skaidri veicāt ar .close uz faila tura —, tāpēc nekas nepaliek atvērts. Visbeidzot .chomp noņem beigu jauno rindu, ko echo pievieno.

Tas pats darbojas ar shell, kas noder cauruļvada rezultāta noķeršanai:

my $proc = shell 'echo hello | tr a-z A-Z', :out;
say $proc.out.slurp(:close).chomp; # HELLO

Noķert var arī kļūdu plūsmu — ar :err un atbilstošo turi .err. Padodot gan :out, gan :err, abas plūsmas paliek nošķirtas, katra savā turī, tāpēc tās var lasīt atsevišķi:

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

Šeit čaulas komanda izdrukā vienu rindu standarta izvadē un vienu standarta kļūdu plūsmā (>&2 uz to novirza). Tā kā prasījām abas plūsmas, .out un .err tās satur neatkarīgi — programmas parastā izvade nekad nesajaucas ar tās diagnostiku.

Izvades noķeršana ir veids, kā ārēju programmu izmantot par būvbloku: palaidiet to, nolasiet tās rezultātu un turpiniet ar šiem datiem savā programmā.

Kursa navigācija

Viktorīna — Programmu palaišana   |   Proc objekts


💪 Vai arī dodieties tieši uz šīs sadaļas vingrinājumiem.