呪いのコード

仕事で使っているスクリプトに修正の必要が発生しました。このスクリプトは、勿論、僕が書いたものではなく、古の誰かのコーディングによるもの。そして、やっぱり恐怖のコードが存在していました oTL

判っている。悪いのはPerlじゃなくて、それを使う方だって事くらいは。それでも、Perlのユーザには、あまりにこういう輩が多い気がしてならないんだっ。

問題の、スクリプトは、データベースへのアクセスをするのですが、データベースの名前、サーバ、ユーザ名、そして、パスワードなどの情報を、スクリプト外の別ファイルに持っていて、getVarValue()という手続きでそれを取り出すようになっています。
$dbuser = getVarValue("DB_APP_SYB_USER");
そして、別ファイルの方には、対応するキーと値が書かれているわけです。
DB_APP_SYB_USER=hoge
今回、データベースの管理をしている部署から、データベースの変更があったので、このスクリプトの方も修正して欲しいという要求がありました。キーと値がかいてあるファイルを修正すれば終了の簡単な話です。このファイルは'#'で始まるコメントが、ファイル中に見られるので、当然、普通にコメントが使えるだろうと、古いデータベースの設定をコメントアウトして、新しい設定を追加しました
DB_APP_SYB_DATABASE=newdb
#DB_APP_SYB_DATABASE=olddb

さて、早速実行してみると……変えたはずなのに、古いデータベースにアクセスしています。どうして?! ……そう、呪いのコードは、getVarValue()にいたのです。

sub getVarValue
{
  my $paramName = shift;
  chomp $paramName;
  my $env_file = "envfile";
  my $returnValue = `fgrep $paramName $env_file | /bin/cut -d'=' -f2`;
  chomp $returnValue;
  return $returnValue;
}
…… oTL
どこにもコメントの処理はいってないじゃん oTL
つまり、コメントアウトしたと思っていたものが、がっつり生きていたと、こういうワケで…… oTL
せめて
  my $returnValue=`fgrep $paramName $env_file|fgrep -v '#'|/bin/cut -d'=' -f2`;
とかしてくれていれば。もっと本式には、
my $varValueCache = {};
sub getVarValue
{
  my $paramName = shift;
  chomp $paramName;
  my $env_file = "envfile";
  return $varValueCache->{$paramName} if defined($varValueCache->{_ready});
  open(my $f, $env_file);
  while(my $line = <$f>)
  {
    chomp $line;
    ($line,) = split(/#/, $line);
    next if $line eq '';
    my ($tag, $value) = split(/=/, $line);
    next unless defined($value);
    $varValueCache->{$tag} = $value;
  }
  close($f);
  $varValueCache->{_ready} = 1;
  return $varValueCache->{$paramName};
}
くらいのことを書いておいてくれれば……いや、コメント処理しないなら、思わせぶりなコメント行をそこここに置いておくなって言う…… oTL