system関数を大量に使うスクリプトのデバッグ

system関数を大量に使うスクリプトを書いたとき、ディレクトリを消すというような
処理がある場合に、実行するのが怖い。コメントアウトして、実行するコマンドを
表示するというのも面倒。なんで環境変数により, system関数を一時的に置き換える
ようにしてみた。本当に怖い場合は、明示的に指定した場合にのみ実行、そうでない
場合は表示のみにする方が良いかもしれません。

コード

#!perl
use strict;
use warnings;

BEGIN {
    if ($ENV{DEBUG}) {
        no warnings 'redefine', 'once';
        my $count = 0;
        *CORE::GLOBAL::system = sub {
            print "[$count] ", "@_", "\n";
            $count++;
        };
    }
};

system "du", "-s", "-h";
system "printf", "Today is ";
system "date";
system "cal", "12", "2011";
system "printf", q['%d = %x(in hex)\n'], '255', '255';

実行

  % DEBUG=1 perl debug_system.pl
  [0] du -s -h
  [1] printf Today is 
  [2] date
  [3] cal 12 2011
  [4] printf '%d = %x(in hex)\n' 255 255

おわりに

system関数を呼ぶのをどこか一箇所にして、そこだけで
対応という方が綺麗かもしれませんが、なんとなく書いたコード
だとついこんな感じになってしまったので、こうしてみました。


普通に書くなら、局所化すべきでしょう。