perlでopen3を使うとき

例によって自分用メモ

  • 標準出力、標準エラーを同時に扱いたいとき等にopen3を用いる
  • $cmd_errがundefの場合標準エラーも$cmd_outで扱われてしまう
  • そこでSymbol::gensysなどで初期化するのを忘れない
#!/usr/bin/env perl

use strict;
use warnings;
use IPC::Open3;
use Symbol;

my $cmd = "ls ./HQ9+ /hoge"; # execute command

my ($cmd_in, $cmd_out, $cmd_err)
  = (gensym, gensym, gensym);

open3($cmd_in, $cmd_out, $cmd_err, $cmd);

my @out = <$cmd_out>;

my @err = <$cmd_err>;

printf"=== stdout =============================================\n";
print @out;
printf"=== stderr =============================================\n";
print @err;
printf"========================================================\n";

close $cmd_in;
close $cmd_out;
close $cmd_err;




[youichi@dell]~/junk% perl open3.pl
=== stdout =============================================
./HQ9+:
HQ9+
HQ9+~
hoge
=== stderr =============================================
ls: /hoge: そのようなファイルやディレクトリはありません
========================================================
[youichi@dell]~/junk%