open3

実行したコマンドの標準出力と標準エラーの両方を別個に取得したいというだけだったのですが、やけに手間取ってしまいました。とりあえずメモしておきます。
最初はPerl Cookookのサイトに乗ってるサンプルコードをコピペしただけでイヤッホウ! だったのですが、実アプリ上で稼動させてみると、これが結構な頻度でストリームから読み出すところでガチンとブロック。あれ、ちゃんと select さんは can_read だって言ってるのに。
途方にくれて、藁にもすがる思いで延々ひたすら検索しまくっていたら、おもむろに実コードらしきものを発見(ウォ、ホスト名が sixapart)。どれどれと見てみると、あ、読み出しにsysread使ってる……。

If you try to read from the child's stdout writer and their stderr writer, you'll have problems with blocking, which means you'll want to use select() or the IO::Select, which means you'd best use sysread() instead of readline() for normal stuff.

よくマニュアル見てみると、しっかりと書いてありました。そんだけのことだったのですね。あぎゃ。


ref:
Perl 5.8.8 documentation - IPC::Open3
Perl Cookbook - 16.9. Controlling the Input, Output, and Error of Another Program
code.sixapart.com - IPC::Cmd