※ ChatGPTを利用し、要約された質問です(原文:ファイルの中身を変更するcgi(関連))
ファイルの中身を変更するCGIの実装について
このQ&Aのポイント
ファイルの中身を変更するCGIの実装についてお手伝いいたします。特定のステップを最後に実行する一連のCGIを作成し、漢字化機能を追加する方法を説明します。
現在実装しているCGIに漢字化のステップを追加するためのロジックについて誤りがある可能性があります。具体的な問題点を特定し、上手く動作するよう修正する方法を教えます。
漢字化のステップが正しく実行されず、また予期せぬステップも実行される問題が発生しています。問題の原因を特定し、適切な修正方法を提案いたします。
お世話になります。
少し前の質問「ファイルの中身を変更するcgi」
(http://oshiete1.goo.ne.jp/qa5533718.html)で
ryu chanさんに教えていただきました。
本件については全く上手く動いたので、
喜んでいまして、
これが出来たので最終的にやろうとしていたことを実行したく、
再度質問させていただいた次第です。
というのは、
今回単体では漢字化が可能になり、
結果も思ったとおりに出力されているのですが、
最終構想ではこのステップを最後ステップにして
一連のcgiを作成したいと思っています。
具体的には、
***************ここから
if ($FORM{'mode'} eq 'jikkou') {&header;
&cstp1;
&cstp2;
&cstp3;
&cstp4;
&cstp5;
&cstp6;}
else {&kijunbi;}
exit.
***************ここまで
(初めに基準日を入力させ、以降ファイルの化工をし、
最後に漢字化して終了)
の様なロジックになっており、
今回教えていただいた部分(漢字化)はcstp6に該当します。
前段で作成したファイルを読み、漢字化して終了、
という構想です。
喜んでcstp6に埋め込んだのですが、
上手く動きません。
基本的なことが分かっていないからだと思います、
申し訳在りません。
症状は、
(1)漢字の入力まで行きますが、出力してくれず、
(2)また&kijunbiを実行してしまいます。
(2)はなぜかは分かりますが、対応の方法が分かりません。
(1)についてはサッパリ分かりません。
ということで、
前回同様、手直し部分を教えていただきたいのです。
なにとぞ宜しくお願いします。
お礼
#!/usr/local/bin/perl $|=1; #データのフラッシュ require './jcode.pl'; #jcode.plへのパス print "Content-type: text/html\n\n"; # データ形式 $bgcolor = "green"; $home = "../compctl1.html"; #main &decode; if ($FORM{'mode'} eq 'stage2') {&header; &cstp6;} elsif ($FORM{'mode'} eq 'kanji') {cstp6;} else {&stage1;} exit; sub cstp6 { use CGI; use Fcntl qw(:flock); my $org_file = 'compewk.log'; # オリジナルファイル(漢字名なし) my $new_file = 'compewk.txt'; # 新規作成ファイル(末尾に漢字名あり) my @students; open my $fh, -f $new_file ? $new_file : $org_file or die $!; flock $fh, LOCK_SH; while ( my $line = <$fh> ) { chomp $line; my %data; @data{ qw(name score kanji) } = split /<>/, $line, -1; push @students, \%data; } close $fh; seek STDIN, 0, 0; my @kanji_names = CGI->new->param('kanji'); if (@kanji_names) { my $tmp_file = $$ . ".tmp"; open my $out, '>', $tmp_file or die $!; flock $out, LOCK_EX; for my $i ( 0..$#students ) { $students[$i]{kanji} = $kanji_names[$i] || $students[$i]{kanji}; print {$out} join( "<>", map $students[$i]{$_}, qw(name score kanji) ), "\n"; } close $out; rename $tmp_file => $new_file; } print "Content-Type: text/html\n\n"; print qq{<form action="$ENV{SCRIPT_NAME}" method="post"><p>\n}; print qq{<input type="hidden" name="mode" value="kanji">\n}; for my $student (@students) { print qq{$student->{name}<input type="text" name="kanji" value="$student->{kanji}">$student->{score}<br>\n}; } print q{<input type="submit" value="送信"></p></form>}; }
補足
#デコード処理 sub decode { # プラウザからのデータ取込み read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); # プラウザからのデータ変換 @pairs = split(/&/,$buffer); foreach $pair (@pairs) { #1行毎に$name,$valueを取り出す ($name, $value) = split(/=/, $pair); # 変換演算子 tr + を スペースに置き換え $value =~ tr/+/ /; # 変換演算子 s/// 単語の構成文字にマッチ $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # " を " に変換 $value =~ s/"/"/g; #\n を "" に変換 $value =~ s/\n//g; # 日本語に変換(デコード処理部分) &jcode'convert(*value,'sjis'); &jcode'convert(*name,'sjis'); $FORM{$name} = $value; } } sub stage1 { &header; print <<"TKDBBS"; <center> <FORM action="./sample.cgi" method="POST"> 抽出基準日:<input size="10" type="text" name="kijun" istyle="4"><br> <input type="submit" value="抽出する"><br> <input type="hidden" name="mode" value="stage2"><br> </FORM> </center> </BODY> </HTML> TKDBBS } #ヘッダ部分処理 sub header { print <<"TKDBBS"; <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <TITLE>大会</TITLE> </HEAD> <BODY bgcolor="$bgcolor"> <A href="$home"><font color="red">戻る</font></A><br> <center> <h3><font color="red">大会作業</font></h3><hr> </center> TKDBBS } ryu_chanさん、大変お世話になります。 seek、変化がありませんでした。 唐突ですが、 また説明漏れが怖いので、全てをアップさせて貰いました。 (文字数の関係で、お礼から補足へ繋がります) 指摘を受けたところは出来ていると思うのですが自信がありません。 一通り見て頂けると嬉しいです。 cstp1~5は問題ないと思い、割愛しました。 (別の方法で確認しました。) お手間を掛けさせ恐縮ですが宜しくお願いいたします。