IPC::Cmdの使い方など

少しハマったので整理

使い方の基本

use IPC::Cmd qw[can_run run];

$command = 'ls';
#コマンドのパスを取得
my $full_path = can_run($command) or die 'ls can\'t use!';
my $buffer;
my($success, $error_message, $full_buf, $stdout_buf, $stderr_buf) = run(command => $command, buffer  => \$buffer);
if (!$success) {
    die @$stderr_buf[0];
}

print $buffer;

文字列を渡す場合の注意

echo "1 2 3 | cut -d ' ' -f1

これをrunに落とし込む場合、

run(command => ['echo', "1 2 3", '|', 'cut', '-d', ' ', '-f1'], buffer => \$buffer);

となる

区切り文字の指定は"' '"ではない

バッファーについて

実行の戻り値として取得する各種バッファーは配列リファレンスとなっている この配列は実行環境のバッファサイズ(バイト数)で区切られている

改行ではないので、CSV等を取得しループでsplitするといったときにはバッファ同士を結合する事前処理が必要になる

引数で渡した$bufferはすべての出力が入っているのでこっち使うほうが楽