プロが教えるわが家の防犯対策術!

ユーザー検索機能が出来るようにカスタマイズしています。

member.datにユーザーデータが入ってます。

member.dat
$name,$add,$mail

実データ
田中誠,大阪府,hoge@hoge.com
伊藤武,東京都,hoge@hoge.com
田中信也,栃木県,hoge@hoge.com
中井洋子,東京都,hoge@hoge.com
石橋浩史,京都府,hoge@hoge.com


$keywordはこのプログラムの前に、<INPUT size="30" name="keyword">で格納しています。

$keywordには「田中」とデータが入っています。


検索プログラム user.cgi

省略・・・
open(DB,"$memfile") || &error("Can't write $memfile");
@lines = <DB>;
close(DB);
foreach ($start .. $end) {
($name,$add,$mail) = split("<>", $lines[$_]);

if ( $name!~ /($keyword)/){
print <<"EOM";
該当の名前
$name
EOM
exit;
}
}

以下省略・・・

$keyword に 「田中」と入っていた場合、1件目と3件目が表示されると思っているのですが、実際には1件目だけしか表示されません。

ifの条件式を変えればうまくいきそうな気がしてますが、よくわかりませんでした。

ご指導いただけますと助かります。

以上、よろしくお願いいたします。

A 回答 (2件)

exit; があると、とにもくもマッチしたらそれで終わり、になるので、foreachaの外側に置いてはどうでしょうか。



・・省略・・・
該当の名前
$name

EOM
}
}
exit;

この回答への補足

回答ありがとうございます。

早速exit; を外側に置いてみましたが、変わりませんでした。

また条件式を
if ( $name!~ /($keyword)/){

if ( $name =~ /$keyword/){
に変えてみました。

感覚的で申し訳ないのですが、1件目しか処理をしていないような感じです。
このやり方に問題があるのでしょうか?

補足日時:2009/06/28 13:52
    • good
    • 0

$flg = 0;


open(DB,"$memfile") || &error("Can't write $memfile");
eval{flock(IN,1);};
$Mes = "該当の名前<br>";
while(<DB>){
($name,$add,$mail) = split(/,/);
if(index($name,$keyword) >= 0){
$Mes .= "・$name<br>";
$flg = 1;
}
}
close(DB);
#表示
if($flg){
print $Mes;
}else{
print "該当しませんでした";
}

これでできると思います。

気になる点は
1.splitが<>で区切っている
2.$start .. $endになにが代入されているか
です。

中2の回答なので変なところはあると思いますが参考までに。
    • good
    • 0
この回答へのお礼

taporuさん

回答ありがとうございます!!

早速やってみました!!

単体テストではバッチリです!!

非常に助かりました。

>中2の回答なので変なところはあると思いますが参考までに。

とんでもございません。
私こそ、質問の仕方が悪く理解出来ない部分もあったかと思います。

本当にありがとうございます。

お礼日時:2009/06/28 14:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!