• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:どうやればいいのかわかりません><;)

プログラムで特定のワードをマッチさせて、文章を書き込む方法を教えてください

このQ&Aのポイント
  • プログラムを使って特定のワードがマッチした場合に文章を書き込む方法を教えてください。
  • プログラムの中で@delという配列に格納されたワードと、$FORM{'sub_product'}に入っているワードを比較し、マッチした場合には$inという文章をlog.csvに書き込みたいです。
  • 初心者ですが、上記の要件を満たすプログラムの作成方法を教えていただけないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.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)
回答No.4

>if ( "$FORM{'sub_product'}" =~ /$del_word/x){ >で空白を無視する場合は、配列の中のワードは全てくっついてしまうのですか?? $del_word は、foreach で取り出した、1つですから、くっついてしまうということはありません。

qaz911
質問者

お礼

で・・・できましたーっ!!! 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; }

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

>@delだけを表示させてみると、 >csvファイルに入ってるワードが半角スペースで区切られて表示されてるんです;; print @del; というように表示を試しているということですか? foreach $x (@del){ print ":$x:\n"; } で、コロンの前にスペースがあったり、改行されたりするなら、 本当にスペースがあるのでしょうね もし、そうだとしたら、書き出しの側に問題があるような気がしますが、 パターンマッチングする前に $del_word =~ s/\s+//g; として空白を削除してやるか if ( "$FORM{'sub_product'}" =~ /$del_word/x){ として空白を無視するオプションをつければ良いと思います。

qaz911
質問者

お礼

早速の返信ありがとうございます!! >print @del; >というように表示を試しているということですか? そのように表示してみたところ、やはり半角スペースが入ってました;; if ( "$FORM{'sub_product'}" =~ /$del_word/x){ で空白を無視する場合は、配列の中のワードは全てくっついてしまうのですか?? 半角スペースをカンマに変えれば、ちゃんとした配列としてみなされるのでしょうか? そういった場合、どういう風に作ればいいのでしょうか? たくさん質問かいてすみません><; BLUEさんほんと詳しいので、もしよろしければまた回答おねがいしますーっ!!

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

@delの中身に改行が残ってるということだったら chomp @del; を foreach $del_word ( @del){ の前に入れてやればいいかと思います。

qaz911
質問者

お礼

返信ありがとうございます!! やってみたのですが、なんだかうまく機能してないみたいなんです;; @delだけを表示させてみると、 csvファイルに入ってるワードが半角スペースで区切られて表示されてるんです;; なんででしょうか><;

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

どういう風にうまくいかないのでしょうか? seek ?

qaz911
質問者

補足

あ、説明不足でした><; 早速みていただいてありがとうございますーっ!! えっとですね、 @delの中身なんですが、 csvファイルで1つのセルごとに右にワードをいれていくと、 中身がカンマで区切られるのですが、 自分は改行して文字を入力しているので、 中身が半角スペースで区切られてるみたいなのです。。。 だからか、なぜだかうまく$del_wordに@delの中身が入らないみたいなんですよね;;; 説明下手でごめんなさいーっ><; またなにかございましたらすぐ補足いたしますっ! どうぞよろしくおねがいしますm(_)m

関連するQ&A