• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:perlで自動採番)

perlで自動採番機能を付けたプログラムの導入について

このQ&Aのポイント
  • perlを使用して自動採番機能を実装する方法について教えてください。具体的には、html内のフォームから入力した値を受け取り、選択結果に基づいて自動で番号を付けたテキストファイルを作成する方法について知りたいです。
  • 具体的な要件としては、htmlフォーム内で選択した項目に対して番号を付け、その番号をテキストファイルに自動で入力する必要があります。また、テキストファイルの作成は、既存のファイルが存在しない場合に行い、カンマ区切りでデータを自動入力するようにしたいです。
  • このような自動採番機能を実装するためには、Perlを使用してフォームの値を受け取り、選択結果に基づいて番号を付けるプログラムを作成する必要があります。また、テキストファイルにデータを自動入力するためには、既存のファイルがあるかどうかを判定し、存在しない場合には新規作成するプログラムも必要です。

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

  • ベストアンサー
  • TNY
  • ベストアンサー率42% (69/163)
回答No.3

こんにちは。ざっと確認した程度なのですが、セミコロン区切りであれば @temp = split(/,/,$last_data); の行は @temp = split(/;/,$last_data); になり、 $add_data = "$in{'a_day'},$in{'sentaku'},$new_value,$in{'name'},$in{'biko'}\n"; の行も $add_data = "$in{'a_day'};$in{'sentaku'};$new_value;$in{'name'};$in{'biko'}\n"; のようにセミコロンに変える必要があると思います。 (一般的なカンマ区切りを想定していましたので) また、りんご、みかん、もも、程度でしたらif~elsif~elseでもいいですが、もし種類が増えるようであれば、処理部分は共通にして、対象のtxtファイルだけ選択肢別に変えてやるようにするとソースがすっきりしますね。 他、特に気づいた点はありませんでした。

perl_beginner
質問者

お礼

TNYさん。 確認有難うございます。 私は、まだperlを勉強し始めてから間もないのですが、わけのわからない質問にも親切に回答していただき本当に感謝しています。 お礼の次にまたまた質問なのですが、TNYさんが書いてくれた処理部分を共通にするってどのような式なのでしょうか? 実際のperlを記述する際には、8~10種類の選択があり、今後も増える可能性があるものですので、ぜひ教えていただきたいのです。他のサイトで調べると色々ごちゃごちゃになってしまい、収集がつかなくなってしまうのです。 また、CSVに吐き出す式も存在すると話を伺ったのですが、それも可能なのでしょうか? 大変申し訳ありませんが、またまた参考意見を聞かせてください。 宜しくお願いします。

その他の回答 (2)

  • TNY
  • ベストアンサー率42% (69/163)
回答No.2

やることとしては以下のようなことだと思います。 ・該当の種類(Aみかん/Bりんご)のtxtファイルをオープン ・データを読み出し、最後の行の3列目(番号部分)を取り出す ・取り出した値と、新たに選択された個数を加算 ・入力内容&加算した値のデータ列を行の最後に追加 その場合、ソースのメイン部分は以下のようになると思います。($IN{'...'}はフォームの取得部分) #データを読み出し(該当txtは判別済みとする) open FILE,"りんご.txt"; @data = <FILE>; close FILE; #最後の行の番号部分を抜き出して、それにフォームで選択された個数を加算 $last_data = pop @data; @temp = split(/,/,$last_data); $new_value = $temp[2] + $in{'個数'}; $add_data = "$in{'日付'},$in{'種類'},$new_value,$in{'名前'},$in{'備考'}\n"; #追記形式でデータを保存 open FILE,">>りんご.txt"; print FILE $add_data; close FILE; 見当違いでしたらすみません。 ご参考になれば幸いです。

perl_beginner
質問者

補足

TNYさん。 お礼が遅れて大変申し訳ありません。 全然検討違いではありません。有難うございます。 さらに質問なのですが、 TNYさんから教えて頂いたソースを見て他サイトなどで試行錯誤して サンプルを作ってみたのですが、 この記述でよろしいのでしょうか? 大変面倒かとは思いますが、確認をして頂けないでしょうか? 申し訳ありませんが、宜しくお願い致します。 再度やりたいことは ・クライアント側  必要項目を選択&入力するだけで欲しい数が一目でわかる。(00番~00番) ・サーバー側  クライアントに送信したデータを指定のテキストファイルにセミコロン区切りで  どんどん蓄積していく。 大変申し訳ありませんが宜しくお願い致します。 ################################## #   以下HTML↓ ################################## <HTML> <HEAD><TITLE>フォームサンプル</TITLE></HEAD> <BODY> <FORM METHOD="POST" ACTION="form.cgi"> 日付:<INPUT TYPE="text" NAME="a_day"> 欲しい果物:<SELECT NAME="sentaku"> <OPTION SELECTED VALUE="ringo">りんご <OPTION VALUE="mikan">みかん <OPTION VALUE="momo">もも </SELECT> 何個欲しい?:<SELECT NAME="kosu"> <OPTION SELECTED VALUE="1">1 <OPTION VALUE="2">2 <OPTION VALUE="3">3 ・・・・以下100まで続く <OPTION VALUE="100">100 </SELECT> 名前:<INPUT TYPE="text" NAME="NAME"> コメント:<TEXTAREA ROWS=5 COLS=80 NAME="comment"></TEXTAREA> <INPUT TYPE="submit" VALUE="OK"><INPUT TYPE="reset" VALUE="クリア"> </FORM> </BODY> </HTML> ################################## #   以下perlスクリプト↓ ################################## #!/usr/local/bin/perl require './cgi-lib.pl'; %form = &read_input('euc'); $a_day = $form{'a_day'}; $sentaku = $form{'sentaku'}; if( "ringo" ){ open FILE,"ringo.txt"; @data = <FILE>; close FILE; #最後の行の番号部分を抜き出して、それにフォームで選択された個数を加算 $last_data = pop @data; @temp = split(/,/,$last_data); $new_value = $temp[2] + $in{'kosu'}; $add_data = "$in{'a_day'},$in{'sentaku'},$new_value,$in{'name'},$in{'biko'}\n"; #追記形式でデータを保存 open FILE,">>ringo.txt"; print FILE $add_data; close FILE; } elsif( "mikan" ){ open FILE,"mikan.txt"; @data = <FILE>; close FILE; #最後の行の番号部分を抜き出して、それにフォームで選択された個数を加算 $last_data = pop @data; @temp = split(/,/,$last_data); $new_value = $temp[2] + $in{'kosu'}; $add_data = "$in{'a_day'},$in{'sentaku'},$new_value,$in{'name'},$in{'biko'}\n"; #追記形式でデータを保存 open FILE,">>mikan.txt"; print FILE $add_data; close FILE; } else{ open FILE,"momo.txt"; @data = <FILE>; close FILE; #最後の行の番号部分を抜き出して、それにフォームで選択された個数を加算 $last_data = pop @data; @temp = split(/,/,$last_data); $new_value = $temp[2] + $in{'kosu'}; $add_data = "$in{'a_day'},$in{'sentaku'},$new_value,$in{'name'},$in{'biko'}\n"; #追記形式でデータを保存 open FILE,">>momo.txt"; print FILE $add_data; close FILE; } $kosu = $form{'kosu'}; $comment = $form{'comment'}; print "Content-type: text/html\n\n"; print "<HTML>\n"; print "<HEAD><TITLE>フォーム受け取りサンプル</TITLE></HEAD>\n"; print "<BODY>\n"; print "<H2>結果</H2>\n"; print "<HR>\n"; print "番号取得日 :$a_day<BR>\n" print "名前 :$NAME<BR>\n"; print "使用番号  :$kosu<BR>\n"; print "コメント  :$comment<BR>\n"; print "</BODY>\n"; print "</HTML>\n";

  • TNY
  • ベストアンサー率42% (69/163)
回答No.1

むむ、、 単に○○.cgiで結果の表示とCSVへのオープン&書き込みを行えばいいだけのように見えますが… (自分が十分理解できてないのかもしれません) どこで悩んでおられるのかも質問に含めると良いと思います。

perl_beginner
質問者

補足

早速の回答有難うございます。 文字数が足らなくて(質問の場合800字以内)説明不十分となっていました。申し訳ありません。 何が困っているかというと、 まず、自動採番をした結果をテキストファイルに蓄積していく方法がわからないのです。私は、カウンターの応用でできると考えていたのですが、カウンターは現在数+1であることに対し、 質問した方法はクライアントの選択結果により 1~100までの数字が必要になってしまいます。 この数字の変化をどうすればうまく動かせるのかがわからずに苦戦しています。 私は、perlを勉強してまだ間もないので応用が利かない状態であり、うまく説明できない箇所もあります。 しかし、TNYさんが言うとおり、最終的にはCSVへ保存→蓄積を考えています。また参考意見を聞かせてください。 宜しくお願いします。

関連するQ&A