X::Proc::Async::OpenForWriting

X::Proc::Async::OpenForWriting

Proc::Async로 외부 프로그램을 실행할 때, 기본적으로는 그 프로그램의 표준 출력(stdout)만 읽어와요. 그런데 쓰기를 하지 않도록 열었는데도 write, print, say 같은 쓰기 동작을 시도하면 문제가 되죠. 그때 던져지는 예외가 X::Proc::Async::OpenForWriting이에요.

출처: Raku 공식 문서 — X::Proc::Async::OpenForWriting

본문

Proc::Async 객체를 외부 프로그램에서 읽기만 하도록 열었는데(즉 open:w를 넘기지 않았는데) write, print, say 같은 쓰기 연산을 수행하면 이 예외가 발생해요.

my $proc = Proc::Async.new("echo");
$proc.start;
$proc.say(42);
CATCH { default { put .^name, ': ', .Str } };
# OUTPUT: «X::Proc::Async::OpenForWriting: Process must be opened for writing with :w to call 'say'␤»

고치려면 :w 플래그를 붙여 쓰기 가능한 명령으로 열면 돼요. 아래는 cat을 쓰기 가능하게 연 다음 데이터를 보내는 예시예요.

my $prog = Proc::Async.new(:w, 'cat');
$prog.stdout.tap( -> $str {
    print $str;
});
my $promise = $prog.start;
await $prog.say('foo');
$prog.close-stdin;
await $promise;

메서드

method method

method method(X::Proc::Async::OpenForWriting:D:)

예외를 일으킨 메서드의 이름을 돌려줘요. 위 예시에서는 say가 되겠죠.