我ながらひどすぎる

普通やらないようなバグ書いちゃってましたorz。何かって言うとifとunlessの間違い。正しくはifなんだけど、何を勘違いしたかunlessって書いちゃってる。ひどいミスをしたときは二度とやらないようにエントリにしてしまいましょう。

opendir DIR, $dir or die "$!\n";
while (defined(my $file = readdir DIR)) {
    next if $file =~ /^\.\.?$/; # Current/Parent directory
    next if 〜;

    hoge;
}
closedir DIR;

こんな感じのコードって結構あると思うんだけど。ここで書いていたのが以下のコード。

next unless grep {$file =~ /$_/} @regexp; # 間違い
next if grep {$file =~ /$_/} @regexp;     # 正解

@regexpの中身はqr//でコンパイル済み正規表現。ほげほげしちゃいけないファイルに対してマッチする正規表現のリストです。これはunlessになってるけど、マッチしたら次のファイルを試さないといけないから、実際にはifじゃないといけないところ。まだ試しに書いてるだから実際にはhogeの部分は本当の処理じゃなくてファイル名を表示するだけなんだけど。これでファイル名が表示されてしまってたから、パッと見ただけでは間違ってることに気付けませんでしたorz。ちょっと吊ってきます。

(しばらくお待ちください)。

ただいま。で、それを直すとファイル名が表示されなくなって、どこがおかしいのかと思って最初から追ってみたら。結局@regexpを作ってるところから間違えてました。

@regexp = map {chomp, qr/$_/} @list; # 間違い
@regexp = map {chomp; qr/$_/} @list; # 正解

セミコロンとカンマを間違えてた。等価なforeachにしてみるとこんな感じなのかな。

# 間違い
foreach (@list) {
    push @regexp, chomp;
    push @regexp, qr/$_/;
}

# 正解
foreach (@list) {
    chomp;
    push @foreach, qr/$_/;
}

ようするに@regexpに変なのが混ざってた。これを直してとりあえずはうまく動いてるみたい。まだまだ書かなきゃいけないのがたくさんあるのになぁ。