- ベストアンサー
プログラムで特定のワードをマッチさせて、文章を書き込む方法を教えてください
- プログラムを使って特定のワードがマッチした場合に文章を書き込む方法を教えてください。
- プログラムの中で@delという配列に格納されたワードと、$FORM{'sub_product'}に入っているワードを比較し、マッチした場合には$inという文章をlog.csvに書き込みたいです。
- 初心者ですが、上記の要件を満たすプログラムの作成方法を教えていただけないでしょうか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>以下ではなぜか動作しません><; 多分、 @delと@nodelと@limdel の配列のサイズが違うのに $nで参照しているからじゃないですかね~ 同じサイズの配列で、同じ位置にあるもので判定するならいいかもしれないですけど。 いちいち、配列でループして調べるのがいいと思いますけど 例えば、あんまり能率を気にしないのだったら $retdel =grep "$FORM{'sub_product'}" =~ $_/x, @del; $retnodel =grep "$FORM{'sub_product'}" =~ $_/x, @nodel; $retlimdel=grep "$FORM{'sub_product'}" =~ $_/x, @limdel; とかしておいて if($retdel > 0 && $retnodel==0 && $retlimdel > 0){ #@delでマッチしてかつ、@nodelにマッチしなくてかつ、@limdelにマッチ } とかできるかも(未確認)
その他の回答 (4)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>if ( "$FORM{'sub_product'}" =~ /$del_word/x){ >で空白を無視する場合は、配列の中のワードは全てくっついてしまうのですか?? $del_word は、foreach で取り出した、1つですから、くっついてしまうということはありません。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>@delだけを表示させてみると、 >csvファイルに入ってるワードが半角スペースで区切られて表示されてるんです;; print @del; というように表示を試しているということですか? foreach $x (@del){ print ":$x:\n"; } で、コロンの前にスペースがあったり、改行されたりするなら、 本当にスペースがあるのでしょうね もし、そうだとしたら、書き出しの側に問題があるような気がしますが、 パターンマッチングする前に $del_word =~ s/\s+//g; として空白を削除してやるか if ( "$FORM{'sub_product'}" =~ /$del_word/x){ として空白を無視するオプションをつければ良いと思います。
お礼
早速の返信ありがとうございます!! >print @del; >というように表示を試しているということですか? そのように表示してみたところ、やはり半角スペースが入ってました;; if ( "$FORM{'sub_product'}" =~ /$del_word/x){ で空白を無視する場合は、配列の中のワードは全てくっついてしまうのですか?? 半角スペースをカンマに変えれば、ちゃんとした配列としてみなされるのでしょうか? そういった場合、どういう風に作ればいいのでしょうか? たくさん質問かいてすみません><; BLUEさんほんと詳しいので、もしよろしければまた回答おねがいしますーっ!!
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
@delの中身に改行が残ってるということだったら chomp @del; を foreach $del_word ( @del){ の前に入れてやればいいかと思います。
お礼
返信ありがとうございます!! やってみたのですが、なんだかうまく機能してないみたいなんです;; @delだけを表示させてみると、 csvファイルに入ってるワードが半角スペースで区切られて表示されてるんです;; なんででしょうか><;
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
どういう風にうまくいかないのでしょうか? seek ?
補足
あ、説明不足でした><; 早速みていただいてありがとうございますーっ!! えっとですね、 @delの中身なんですが、 csvファイルで1つのセルごとに右にワードをいれていくと、 中身がカンマで区切られるのですが、 自分は改行して文字を入力しているので、 中身が半角スペースで区切られてるみたいなのです。。。 だからか、なぜだかうまく$del_wordに@delの中身が入らないみたいなんですよね;;; 説明下手でごめんなさいーっ><; またなにかございましたらすぐ補足いたしますっ! どうぞよろしくおねがいしますm(_)m
お礼
で・・・できましたーっ!!! BLUEさんほんとありがとうございますっ!!! あの~・・もう1つ聞きたいところがあるんですけど~・・ よろしいでしょうか><;すみません。;; 「3つのcsvファイルから読み込んだ配列@delと@nodelとlimdelの中身がそれぞれ$FORM{'sub_product'}とマッチするかどうか、@delの中身$del_wordにマッチしてかつ、$nodelにマッチしなくてかつ、$limdelにマッチするもののみをcsvに$inとして書き込む」というプログラムなのですが、以下ではなぜか動作しません><; なにかいい方法はありませんでしょうか? 宜しくお願いします~~><; #データ判別・書き込み foreach $del_word ( @del){ #削除判別ワードでマッチング if ( "$FORM{'sub_product'}" =~ /$del_word/x){ #削除除外ワードでマッチング if ( "$FORM{'sub_product'}" =~ /$nodel[$n]/x){ last; #削除限定ワードでマッチング }elsif( "$FORM{'sub_product'}" =~ /$limdel[$n]/x){ #削除チェックリストオープン open(IN, ">>log.csv") or printErrorPage("エラー"); eval{ flock (FILE, 2) }; seek(IN, 0, 2); #書き込みデータ作成 $in = "$FORM{'title'},"."$FORM{'sub_condition'},"."$FORM{'sub_product'},"."$FORM{'sub_subproduct'},"."$FORM{'sub_exc'},"."$del_word"; print IN "$in"; close(IN); last; } } ++$n; }