Curso de Raku / Objetos, entrada/salida y excepciones / Entrada y salida / Ejecutar programas externos 🆕
Capturar la salida
Para leer lo que imprime un programa externo en lugar de dejar que
vaya a la pantalla, pásale :out al lanzarlo. El
Proc devuelto tiene entonces un manejador .out
del que puedes leer:
my $proc = run 'echo', 'hello', :out;
my $output = $proc.out.slurp(:close);
say $output.chomp; # hello:out redirige la salida estándar del programa hacia el
Proc. El manejador .out funciona como los
manejadores de archivo de la sección anterior, y .slurp lee
todo de una vez. El adverbio :close es un atajo cómodo:
tras la lectura cierra el manejador por ti — el mismo aseo que hacías
explícitamente con .close sobre un manejador de archivo —,
así que no queda nada abierto. Por último, .chomp quita el
salto de línea final que añade echo.
Lo mismo vale con shell, lo que resulta cómodo para
capturar el resultado de una tubería:
my $proc = shell 'echo hello | tr a-z A-Z', :out;
say $proc.out.slurp(:close).chomp; # HELLOTambién puedes capturar el flujo de errores, con :err y
el manejador .err correspondiente. Pasar tanto
:out como :err mantiene los dos flujos
separados, cada uno en su propio manejador, para que puedas leerlos por
separado:
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-lineAquí la orden de la shell imprime una línea en la salida estándar y
otra en el error estándar (>&2 redirige hacia él).
Como hemos pedido ambos flujos, .out y .err
los contienen de forma independiente: la salida normal del programa
nunca se mezcla con su diagnóstico.
Capturar la salida es la manera de usar un programa externo como pieza de construcción: lo ejecutas, lees su resultado y sigues adelante con esos datos en tu propio programa.
Navegación del curso
← Quiz — Ejecutar programas | El objeto Proc →
💪 O ve directamente a los ejercicios de esta
sección.