• ベストアンサー

Perlを改造してエラーチェックできるようにするには

Perl超初心者です。 フリーのアンケートフォームを変えたいと思っています。 名前などを必須項目に変えて、記入がなかった場合に チェックがかかるようにするにはどのように変えたらよいでしょうか? すみませんが、どなたか教えてください。

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

  • ベストアンサー
  • danmarino
  • ベストアンサー率63% (26/41)
回答No.4

ちょっと紛らわしい回答をしてしまったかもしれません。 上書きモード、追加モードの説明は、ファイルに書き込む際のやり方について一般的な説明をしただけであって今回のスクリプトの改造ポイントではありません。 今回は「“別ファイル”に各個人の回答内容を記録したい」とのことですので、既存のロジックを修正する必要はないと思います。 そこで、既出のファイルに書き込むロジックを参考にし、別ファイルに自分の必要なデータを書き込んであげるロジックを追加すればおそらくOKです(これもスクリプト全体を解析しないと正確にはお答えできません)。 書き込むファイル(テキストファイル)は1行1データになるようにし、個々のデータの項目はタブ(\t)とかカンマ(,)とか独自の区切り文字(<>とか)で区切ってやります。 この部分はデータベース設計の初歩の初歩です。あとで取り出しやすい形に設計してあげるのがいいでしょう。 例えば、 個人名(タブ)回答(改行) 個人名(タブ)回答(改行) 個人名(タブ)回答(改行) という形が考えられます。 $dataout = "$in{'tname'}\t$in{'toko'}\n"; #$kojinfileが書き込むファイル open(OUT, ">>$kojinfile") || die &error("ファイルに出力できませんでした。"); flock($file,2); print OUT $dataout\n; close(OUT); flock($file,8); こんな感じになるでしょう(これだけでは不完全なのでいろいろと事情にあわせて変えて下さいね) もちろん < や > を変換するなど危険を回避してあげる必要がありますし、$in{'toko'}にもともと改行がはいっていたらデータがうまく記録できませんので書き込む前にデータを変換しておいてあげる必要があります。

Beginner1
質問者

お礼

ありがとうございました。 別ファイルに保存することができました。 本を読んだだけだと、”こうしたい!”ということに 対応できなかったので、色々参考になりました。 また何かありましたら、よろしくお願いいたします。

その他の回答 (3)

  • danmarino
  • ベストアンサー率63% (26/41)
回答No.3

No.2の返信に書き込んで頂いたソース部分は、ログのデータを読み込んでいる部分です。 データほファイルに書き込んでいるところは、おそらく open(OUT, ">>$logfile") || die &error("ファイルに出力できませんでした。"); flock($file,2); # LOCK print OUT "$dataout\n"; close(OUT); flock($file,8); # UNLOCK という感じになっていると思います(LOCK、UNLOCKの部分はないかもしれません)。 ちなみに1行目のファイルオープンはおそらく「追加モード」(>>$logfile)でしょうが、「>$logfile」になっていたら「上書きモード」です。 $dataoutの部分が実際にファイルに書き込む内容のところになります。 各個人がどのような回答をしたのかを記録するには、個人名と回答を書き込んでいけば大丈夫です(かなり大ざっぱな答えですが…)。 実際にソース全体を見てみないと正確な(具体的な)お答えは出来ません。

Beginner1
質問者

補足

回答、ありがとうございます。 私が書いたのは読み込みの部分だったんですね…。 探したところ、書き込みのところがありました。 上書きモードになっていたので、追加モードに変えてみて、 試してみたのですが、不要な箇所まで記録が残ってしまいます。 色々試してみたのですが、記録で残したいものがどの関数?になっているのか、 分かりません…。 申し訳ないのですが、みていただけますか? 使わせてもらっているフリーフォームは下記のものです。 http://www.netmania.jp/cgi/108.php *別ファイルに各個人の回答内容を記録できるようにしたい お手数おかけしますが、よろしくお願いいたします。

  • danmarino
  • ベストアンサー率63% (26/41)
回答No.2

> if ($in{'tname'} eq '' && $in{'toko'} eq '' && $in{'shozo'} eq ''){&error('メッセージに所属・お名前がありません'); これだと&&で結んでありますので全ての条件が真(=3つ全て空欄)でないと&errorは実行されません。 超初心者ということなのでわかりやすい文で書くと、 if ($in{'toko'}) { #ご意見・ご感想が入っていたら #名前か所属が空白ならエラー if (!$in{'tname'} || !$in{'shozo'}) { &error('メッセージに所属・お名前がありません');} } ちなみに「!$in{'tname'}」は「$in{'tname'}」が空白だったらという意味です($in{'tname'} eq '' と同じ)。

Beginner1
質問者

お礼

分かりやすく説明していただき、ありがとうございました。 エラーがかかるようになり、助かりました。 もう一つ困っていることがあるので、 もしご存知でしたら教えてください。 そのフリーフォームを使ってアンケートに答えると、 別ファイルに回答の票数が一つづつ追加されていくような システムになっています。 多分それが下記の内容ですよね?? open (IN,$logfile) || &error("ログファイルを開けません"); #データファイル読み込み @qset = <IN>; #配列qsetにtohyo.logの各行が要素としてはいる close(IN); chop($qset[0]); $qkazu = $qset[0]; for ($i=1;$i<=$qkazu;$i++){ #質問と選択肢の読み込み @qtemp=split( /,/,$qset[$i]); #読み込んだ行を「,」で区切る 上記のような全体的な集計結果と共に、 各個人がどのような回答をしたのかを 別ファイルに保管できるようにすることはできますか? すみませんが、よろしくお願いいたします。

  • plantarum
  • ベストアンサー率53% (42/79)
回答No.1

超初心者だったらなおさら、改造元がどれか示してください。 どういうアドバイスをしていいかわかりません。

Beginner1
質問者

補足

すみません。 どう質問したらよいか分からなかったもので…。 下記の内容で分かりますでしょうか? もともと、”ご意見・ご感想”欄に記入があった場合に 名前がないとチェックがかかるように設定されていました。 それに所属を追加して、所属と名前が入っていないと エラーメッセージがかかるように変えることはできたのですが、 所属か名前のどちらかしか入っていない場合には、 チェックがかかりません。 すみませんが、よろしくお願いします。 所属 <input type=text name=shozo size="50"><br> 名前 <input type=text name=tname size="20"><br> ご意見・ご感想<BR><textarea name=toko rows=5 cols=70></textarea> if ($in{'tname'} eq '' && $in{'toko'} eq ''&& $in{'shozo'} eq ''){&error('メッセージに所属・お名前がありません');

関連するQ&A