記事修正画面の構築中で複数ある情報を更新する際の問題について

このQ&Aのポイント
  • 記事修正画面の構築中に発生した問題について質問します。複数ある情報の一番最新のものを更新すると、一番古いものまで書き換えられてしまいます。
  • 具体的には、1.2.3という記事があった場合、3を修正すると、3と1が一緒に修正されてしまいます。
  • 問題の原因がわからないため、何がおかしいのかをご教示いただけると幸いです。
回答を見る
  • ベストアンサー

うまく書き換えが出来ない。

記事修正画面部分の構築中です。 現在以下のような感じです。 sub edit3 { # ログファイル読み込み open (FILE, "$data") || &error("ファイルが開けません"); @data = <FILE>; close(FILE); # カウント退避 $count = shift (@data); foreach $line (@data) { ($no,$n1,$a1,$com1,$n2,$a2,$com2,$n3,$a3,$com3,$n4,$a4,$com4,$n5,$a5,$com5,$name,$nani,$kou1,$kou2,$pass) = split(/<>/,$line); chomp; if ($in{'edit_no'} eq $no){ $line = "$no<>$in{'n1'}<>$in{'a1'}<>$in{'com1'}<>$in{'n2'}<>$in{'a2'}<>$in{'com2'}<>$in{'n3'}<>$in{'a3'}<>$in{'com3'}<>$in{'n4'}<>$in{'a4'}<>$in{'com4'}<>$in{'n5'}<>$in{'a5'}<>$in{'com5'}<>$in{'name'}<>$in{'nani'}<>$in{'kou1'}<>$in{'kou2'}<>$in{'pass'}<>\n"; } else {$line = "$no<>$n1<>$a1<>$com1<>$n2<>$a2<>$com2<>$n3<>$a3<>$com3<>$n4<>$a4<>$com4<>$n5<>$a5<>$com5<>$name<>$nani<>$kou1<>$kou2<>$pass<>\n";} push(@new,$line); } # ログを更新 unshift(@new,"$count"); open(OUT,">$data") || &error("修正処理を失敗しました"); print OUT @new; close(OUT); &pass; } さて、この状態で複数ある情報の一番最新のものを更新すると、一番古いものまで書き換えられてしまいます。(1.2.3と記事があった場合、3を修正すると、3と1が修正されてしまう) どこがおかしいのでしょうか?自分では間違っているようには見えないのですが… 修正・改善をお願いします。

  • Perl
  • 回答数1
  • ありがとう数1

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

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

実際に試してみたわけでないので自信無しですが、 foreach $line (@data) { ($no,$n1,$a1,$com1,$n2,$a2,$com2,$n3,$a3,$com3,$n4,$a4,$com4,$n5,$a5,$com5,$name,$nani,$kou1,$kou2,$pass) = split(/<>/,$line); chomp; の部分を foreach (@data) { chomp; $line=$_; ($no,$n1,$a1,$com1,$n2,$a2,$com2,$n3,$a3,$com3,$n4,$a4,$com4,$n5,$a5,$com5,$name,$nani,$kou1,$kou2,$pass) = split(/<>/,$line); としてみたらどうでしょうか? foreach $line (@data) { の時の$line に対する変更は、@data への変更でもあるのでそれが悪さをしているんじゃないかと思うんですが。

master-3rd
質問者

お礼

ありがとうございました!

関連するQ&A

  • 検索結果の表示形式を表形式にしてだしたいのですが・・・

    CGI初心者です。データベース検索のCGIをフリーからカスタマイズをかけて利用を試みています。今の状態では、検索結果が、 print "<LI><a href=\"$script?mode=view&no=$no\">$sub</a>\n"; 状態で表示されます。 が、これをメンテするときの一覧状態にしたいのです。 メンテ時の表示プログラムは、 # 管理画面を表示 &header; $count = @lines; print "<center>\n"; print "<form action=\"$script\" method=\"$method\">\n"; print "<input type=hidden name=pass value=\"$in{'pass'}\">\n"; print "<input type=hidden name=mode value=\"admin\">\n"; print "<input type=hidden name=action value=\"delete\">\n"; print "<table border=1 cellspacing=1><tr>\n"; print "<th>削除<th>料理名<th>食種<th>食材<th>調理法<th>コメント</tr>\n"; foreach $line (@lines) { local($no,$sub,$com,$p1,$p2,$p3) = split(/<>/, $line); $com =~ s/<br>/ /g; $com =~ s/</&lt;/g; $com =~ s/>/&gt;/g; if (length($com) > 60) { $com = substr($com,0,58); $com = "$com" . '..'; } print "<tr><th><input type=checkbox name=del value=\"$no\"></th>"; print "<td><b><a href=\"$script?mode=mente&no=$no\">$sub</a></b></td>"; print "<td>$part1[$p1]</td><td>$part2[$p2]</td><td>$part3[$p3]</td>"; print "<td><small>$com</small></td></tr>\n"; } print "</table><P>\n"; です。どうしたら、メンテ時のような一覧の表形式で表示できるのでしょうか? あと、あまりに言語がわからないので、なにか良い参考書及びHPがあれば教えてください。

    • 締切済み
    • CGI
  • 暗号化 復号化

    今、簡単な暗号化のプログラムを作っています。 $a = $in{"honbun"}; $b = $in{"pass"}; $c = length($in{"honbun"}); $n = 0; while ($n < $c){ $k = substr($a,$n,1); $d = chr(ord($k) + $b); print "$d"; $n++; } pass文だけ、コード値をずらしているのですが、 基準のコード値より大きい数になってしまった場合、 どのように修正してやればよいでしょうか?

    • ベストアンサー
    • Perl
  • テキストエリアが複数あるときの改行変換方法

    CGIを改造中です。 ログに保存するとき改行(<BR>)を変換する必要があると思うのですが、 複数のテキストエリアがある場合はどのようにしたら良いのでしょうか? 現状 $in{'$com1'} =~ s/\r\n/<br>/g; $in{'$com1'} =~ s/\r/<br>/g; $in{'$com1'} =~ s/\n/<br>/g; $in{'$com2'} =~ s/\r\n/<br>/g; $in{'$com2'} =~ s/\r/<br>/g; $in{'$com2'} =~ s/\n/<br>/g; ~~ と言う風に書いていますが、うまく変換されていないようで、ログが崩れてしまっています。 どのように記述するのが良いのでしょうか?

  • コードの中に &#32 とあるのですが、意味と何を処理しているのか分りません。

    有名な方のコードを勉強していたところ、以下のようなコードがありました。 その中に &#32 という部分がありましたが、調べても分りません。 $i=0; while(<IN>){ $i++; . . . print "[<b>$no</b><b>$sub</b>&#32"; print "投稿者:<b>$name</b><small>投稿日:$date</small>&#32"; print "[<a href=\"$script?mode=resmsg&no=$no\">返信</a>]<br>\n"; print "<blockquote>$com<p>$url</blocquote><hr>\n"; } とあります。 &#32 の部分が分りません。教えて下さい。

    • ベストアンサー
    • Perl
  • うまく変数を当てられない?

    フォーム部分を作成中です。 画像が設定されたフォルダにあり、それを選択すると言うことをしたいと思っています。また、以下は修正画面です。 ディレクトリ内のファイルを読み込みoptionに設定ですよね。で、以下のようにやってみました。 foreach $line (@data) { ($nt1,$nc1,$nt2,~~) = split(/<>/,$line); chomp; $e_nt1 = $nt1; $e_nc1 = $nc1;     ~~ } #繰り返し用ナンバー設定 $no = 0; #以下を6回繰り返し while($no<6){ $no++; print "<TR>\n"; print "<TD rowspan=\"3\" bgcolor=\"#999999\"></TD>\n"; print "<TD>\n"; #select開始 print "<SELECT size=\"1\" name=\"nt$no\">\n"; #ディレクトリオープン opendir(DIR , $celdir);  while($view = readdir(DIR)){ # $viewの内容と過去データが一緒なら「selected」をつける   if($view eq ${"nt$no"}){$sel = selected;}    print "<OPTION value=\"$view\" $sel>$view</OPTION>\n";  } print "</SELECT></TD></TR>\n"; print "<TR>\n"; print "<TD><IMG src=\"../../image/menu/${\"e_nt$no\"}\"></TD>\n"; print "</TR>\n"; print "<TR>\n"; print "<TD><INPUT type=\"text\" name=\"nc$no\" size=\"60\" value=\"${\"e_nc$no\"}\"></TD>\n"; print "</TR>\n"; print "<TR>\n"; print "<TD></TD>\n"; print "<TD><BR>\n"; print "</TD>\n"; print "</TR>\n"; } これで、以前選んだ画像名には「selected」が付くと思ったのですが、ファイルが無い「..」と「.」と言うものに「selected」が付いています。 これはどう修正したらいいでしょうか?

  • ログデーターの並び替え

    ログデーターの並び替え 5月1日<>30<>http://com/<>mail@mail 5月5日<>12<>http://com/<>mail@mail 5月7日<>25<>http://com/<>mail@mail 5月10日<>50<>http://com/<>mail@mail 5月23日<>14<>http://com/<>mail@mail 上記のログデータは以下の形式で保存されています。 $date<>$no<>$url<>$mail このログの$noの部分で数値の小さい順、または大きい順に並び替えしたいのですが、 どのようにすればいいのでしょうか? open(IN, "< $logfile"); my $list = <IN>; while(<IN>){ my ($date,$no,$url,$mail) = split(/<>/); if(条件){処理} push(@data, "$_"); } close(IN); #ここで関数 sort を使って並び替えするのだと思うのですが、実際どのようにすればいいかわかりません。 open(OUT,">$logfile"); print OUT $list; print OUT @data; close(OUT); perlは簡単な改造程度しかできなくて、ここのみなさんのように専門的な知識を持っていないので、どうしてもこの並び替えがわからずに困り果てております。お手数ですが、よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • フォームの確認画面について

    お世話になります。 現在アンケートフォームを作成し、そのデータをtxtファイルに保存するというプログラムを作成しました。そこでフォームに入力された確認画面を表示させ、確認画面で送信ボタンを押すと、データが蓄積されるプログラムに変えたいと思ってます。 今現在はフォームはhtml cgiはperlで作成してます。 実際にどのようにすればいいかが分かりません。 フォーム(html)→確認用フォーム(cgi)→蓄積用cgiという流れでいいのでしょうか? また、確認用のフォームには戻るボタンを作りたいのですが、戻った時に、入力したデータは保持しときたいのですが。 よろしくお願いいたします。 データ蓄積用cgiプログラム #! /usr/bin/perl require './cgi-lib.pl'; $answer = 31; $ansfile = "/tesuto.txt"; &ReadParse(*in); $name = "てすと"; for($n = 1; $n <= $answer; $n++ ) { $no[$n] = $in{"no$n"}; } open (FILE,">>$ansfile"); flock (FILE,2); print (FILE "\"", $name); for($i = 1; $i <= $answer; $i++ ) { $no[$i] =~ s/\"/""/g; print FILE "\"\,\""; print FILE $no[$i]; } print FILE "\"\n"; flock(FILE,8); close(FILE); print "Content-type: text/plain\n\n"; print "<HTML><BODY>\n"; print "<META http-equiv=\"refresh\" content=\"0;URL=http://○○○.html\">\n"; print "</body></HTML>"; exit;

    • ベストアンサー
    • CGI
  • logファイルをひらいての処理の仕方を教えてください。

    データベース検索のperlをカスタマイズ中です。 ユーザが入力したものを、検索条件のひとつにしたいのですが、表示されません。 インプットしたものはlogファイルに書き込まれるので、それを開いて反映させればいいのだろうということまでは、なんとかわかるのですが、どのように表記していいのか・・・今はない知恵を絞ってこのように表記しているのですが。 if (!open(FD,"$logfile")) { &error(0); } @lines = <FD>; $cnt = @lines; close(FD); print "<select name=P2 >\n"; print "<option value=\"0\" selected>指定なし\n"; $i =0; foreach $line (@lines) { ($no,$sub,$com1,$com2,$com3,$p1,$p2,$p3,$p4) = split(/\,/,$line); chop; if ($p2 ne '') { $i++; $p2s{($p2)[0]}++; $n++; } } foreach (keys %p2s) { print "<option value=\"$_\">$_\n"; } print "</select></td>\n";

  • フォルダー内の複数ファイル名を一括で変名するbat

    フォルダー内の複数ファイル名を一括で変名するbatを教えてください。 batは、デスクトップに配置して 処理するフォルダーをD&Dして処理させる形式をとしたいです。 以下のような形式です。  No1 aaaa bbbb [com : *********].zip を  No1 aaaa bbbb.zip に変名する。   (*******は任意の文字列) 例えば、 No1 aaaa bbbb [com : taken2110221100014].zip であれば No1 aaaa bbbb.zip に変名する。 以下が参考になりそうなので https://oshiete.goo.ne.jp/qa/9263608.html 記事中の助言を元に以下のようにコードを修正してみましたが うまく処理できませんでした。 bat(test,bat,test2.bat)のどこを再修正すれば希望の処理ができますか ? 希望は、下記ですが 「batは、デスクトップに配置して 処理するフォルダーをD&Dして処理させる形式をとしたいです。」 batを修正してもこのbatでは、D&Dで処理することは可能で無い場合は アドバイス又は他の参考なりそうなURLを紹介ください。 '------------------------------------------ rem test.bat echo off for /F "delims=" %%f in ('dir /*.mp4') do call :sub "%%f" exit /*.mp4 :sub set fname=%~1 set n=0 :loop call set c=%%fname:~%n%,1%% set /a n=n+1 if "%c%"=="" goto :EOF if "%c%"=="[com" goto break goto loop :break set /a n=n-1 set ext=%~x1 call set newname=%%fname:~0,%n%%% call set newname=%newname%%ext% if "%newname%"=="" goto :EOF if "%newname:~0,1%"=="." goto :EOF ren "%fname%" "%newname%" goto :EOF '-------------------------------------- rem bat2.bat for /F "tokens=1* delims=[com" %%F in ('dir /b *.mp4') do echo move %%F[com%%G %%F.mp4 '--------------------------------------

  • ファイルからのデータ読み込みとデータ処理

    ActivePerlをインストールしたばかりの初心者です。 ファイルからデータを読み、データ処理をするプログラムをつくっている所ですが 、データファイルの読み込み後の処理がうまくいきません。 データ処理では、空白文字、マイナスの符号も含めて3個ずつで一つの数値とします。 $a ='-10 -1 0 22177'; @foo = split( /(\s\s\d|\s\d\d|\d{3}|-\d{2}|\s-\d{1})/, $a) ; print "@foo\n"; 【出力結果】 -10 -1 0 22 177 ファイルから1行ずつデータを読み込み、同様の処理を行う以下のプログラムですが、正しくファイルが表示された後は止まってしまいます。 どこで躓いているのかご教示下さい。 #プログラム $no = 1; while ($line = <>) { print $no, "\t", $line; print $line; ++$no; } while ($line = <>) { @foo = split( /(\s\s\d|\s\d\d|\d{3}|-\d{2}|\s-\d{1})/, $a) ; print "@foo\n"; }

    • ベストアンサー
    • Perl