以前にとあるperlスクリプトをphpで書き直すってのをやってもらった訳です。ちょっとそのまんま転載するのは憚られるので、少し変えて掲載します。
if( $str =~ /ABC/ ){ $flag = 1; }elsif( $str =~ /DEF/ ){ $flag = 2; }elsif( $str =~ /GHI/ ){ $flag = 3; }else{ $flag = 1; }
要するに、変数$strに"ABC"を含んでたら$flagに1、変数$strに"DEF"を含んでたら$flagに2、変数$strに"GHI"を含んでたら$flagに3、どれでもなかった場合も$flagに1を代入しろ、っつーことです。これをphpに翻訳したA君(仮名)はこういうコードを書いた。
if( strpos( $str, "ABC" )){ $flag = 1; }elsif( strpos( $str, "DEF" )){ $flag = 2; }elsif( strpos( $str, "GHI" )){ $flag = 3; }else{ $flag = 1; }
んで、その書き直された方のphpの方のどれでもなかった場合に$flagに代入する値を1じゃなくて0にするねっていう改修を僕がやったんですが、このphpのコードの問題点に気付いてなくてへへぇ簡単簡単とかいって単純にこうやっちゃったもんですから、
}else{ $flag = 0; }
バグ作っちゃいましてね。死ね。俺。ちなみに改修前のソースでなぜ問題が起きなかったかというと、$strには"DEF"や"GHI"で始まる文字列が入ってく ることはないんですね。故に、"ABC"で始まる文字列が入ってきたとしてもelseブロックに処理が流れるもんですから結果として$flagには期待通りに1が入 っていたという。
てゆーかなんでpreg_match使わない訳?
てゆーかstrposのオンラインマニュアルにも
警告
この関数は論理値 FALSE を返す可能性がありますが、FALSE として評価される 0 や "" といった値を返す可能性もあります。 詳細については 論理値 の セクションを参照してください。この関数の返り値を調べるには ===演算子 を 使用してください。
て書いてあんだろうがよ、気付けよ、馬鹿。
てゆーかstrposなんか使ったことねーよ。使うなよ。