Perlから外部コマンドを実行する

最近Perlから外部コマンドを実行する場合は、openやsystemなどを使わずにIPC::Cmdを良く使っている。
特に深い理由はないんだけど、

  • IPC::Cmdは5.009005からコアモジュールに入っている
  • それなりに綺麗に書ける
  • $IPC::Cmd::VERBOSEを真にしておけば、実行するコマンドの内容を出力してくれる
  • 戻り値も「標準出力,標準エラー出力,その両方」が、改行区切りで配列になって戻ってくるのも地味に便利

 (『かえりち』だと『返り血』に変換されるので、昔から『もどりち』って言うようにしてる>id:amachang
とかかなあ。多分1番目の理由が大きい。コアモジュールに凝ってるのかもしれない。
ログ吐きにはLog::Message::Simple使うようになったし。
まあLog::Message::Simpleは、daemontools付属のmultilogと相性が良いという理由もあるんだけど。


ちなみにコマンドの出力をインタラクティブに処理したいときは、昔はIPC::Runを使っていたけど最近はIPC::Open3を使ってる。理由はIPC::Runがコアモジュールじゃないからってだけなんだけどさ。



あとFile::*系を良く使うようになったなあ。今までシェルスクリプトで書いてたようなものをPerlで書くようになったからだと思う。ウェブアプリ以外はほとんどシェルスクリプトでパッと書いちゃうタイプなんだけど、やっぱたまに面倒くせぇって思うときがあるんだよね。そんなときPerlで書けるのは良い。


おまけだけど、File::Fetchでリモートファイルを取得できるのを最近知ったんだけど、LWPとかwgetとかcurlとかを自動的に選んでくれるから環境によっては地味に便利だよね。まあでもURI::Fetchと違ってキャッシュできんし、結局IO::All使うからあんまり出番無いんだけどさ。




というわけで誰にも聞かれてないけど、最近のマイPerlモジュール事情を軽く話してみました。