- ベストアンサー
データの入れ替え処理が巧くできないのですが
いつもお世話になります 簡単なDBを作っているのですが、データの更新処理が巧くいかなくててこずっています POSTメッソドで送られてきた name=actionの内容がedit2、の時 sub menteが実行されます同じく name=noの変数には更新したいファイルの番号がセットされます それらを取得して、ファイルを開き $nooの内容(DBのファイル番号)とnoが一致したらブラウザから送られてきたデータと その部分のデータ($nooはデータの先頭で以降<>で区切って変数が格納される) を入れ替える処理を行いたいのですがどの様に書いたらいいのでしょうか、下記のコードですと変数 $_に更新される前のデータしか代入できず結果ファイルの入れ替えは行えません open(IN,"$logfile") || &error("Open Error : $logfile"); while (<IN>) { ($noo,@arg_[0..$#eqipument],@p[0..5],$n_article,$w_article,@reselect_marks) = split /<>/; if ($no == $noo ) { $_ = join('<>',$noo,(map{$arg_[$_]}(0..$#eqipument)),$p0,$p1,$p2,$p3,$p4,$p5,$n_article,$w_article,@reselect_marks,),'<>',"\n"; } push(@new,$_); } close(IN); # 更新 open(OUT,">$logfile") || &error("Write Error : $logfile"); print OUT @new; close(OUT); 尚ブラウザから送信されてくるデータは以下のような感じです print qq|<form action=\"$myself\" method=\"POST\">\n|; print qq|<input type=hidden name=mode value=\"admin\">\n|; print qq|<input type=hidden name=action value=\"edit2\">\n|; print qq|<input type=hidden name=no value=\"$no\">\n|; 宜しく御教授お願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんちは。 formから受け取った値をループのなかでしっかり上書きしているみたいですね。 logfileからは第一項目のみ($noo)とりだすようにすると期待どおりにうごきませんかね~ 確認してみてください while (<IN>) { ($noo,@arg_[0..$#eqipument],@p[0..5],$n_article,$w_article,@reselect_marks) = split /<>/; if ($no == $noo ) { ↓ while (<IN>) { ($noo) = split /<>/, $_, 2; if ($no == $noo ) {
その他の回答 (2)
- moon_piyo
- ベストアンサー率60% (88/146)
こんちは osamuyさんへの補足みました。 '<>', "\n"はjoin関数の外にあるために連結はされてないみたいですね でこんな感じでjoin()の中にいれてみましょう $_ = join('<>',$no,(map{$arg_[$_]}(0..$#eqipument)),$p0,$p1,$p2,$p3,$p4,$p5,$n_article,$w_article,@reselect_marks,),'<>','\n'; ↓ $_ = join('<>',$no,(map{$arg_[$_]}(0..$#eqipument)),$p0,$p1,$p2,$p3,$p4,$p5,$n_article,$w_article,@reselect_marks,"\n");
お礼
お世話になっておりますmoon_piyoさんへ、お返事が遅くなりました 急いでいたため、パワープレー(愚の骨頂)のようなコードで一時をしのいでいました(^^;(下記のように、とりあえず動きました) my $a = join('<>',$noo,(map{$arg_[$_]}(0..$#eqipument)),$p0,$p1,$p2,$p3,$p4,$p5,$n_article,$w_article,@reselect_marks,),'<>',"\n"; $_ = "$a\n"; 連結がうまくいってないと感じていたためjoinで内包してしまうように試していたのですが'<>'と"\n"を括弧の中に含めていたため 思い通りに動きませんでした、お陰さまで間違いがよく分かりました ありがとうございました。
- osamuy
- ベストアンサー率42% (1231/2878)
質問文のコードでは、 送信内容を格納している変数全てを、ログ読み込み時に使いまわしているため、送信内容が消されてしまっていて、ログと同じ内容を再度書き込んでいるように見えます。 No.1さんの回答どおりに修正すれば、正しく動くと思います。
補足
お世話になりますosamuyさん、moon_piyoさんに補足で付け加えた、私のコードが間違っていました 正しくは下記のコードで無事データの入れ替えが行えました、所がここでまた問題が生じました データベースの最後の項目を修正するときちんと、修正が反映されたのですが、途中のデータを入れ替えると修正したデータまでは正常に現れるのですが、修正データ以降のデータが表示されませんでした、おかしく思いサーバーのログファイルを開いてみますと 修正したデータの最後を表す改行コードの \n が消えていて連続して次のデータが書き込まれていました、 $_ = join('<>',$no,(map{$arg_[$_]}(0..$#eqipument)),$p0,$p1,$p2,$p3,$p4,$p5,$n_article,$w_article,@reselect_marks,),'<>',"\n"; として、正しく最後に "\n"; としているに関わらずそのようになってしまいます試しに関係は無いと思いましたが '\n'; としてみましたがやはり結果は一緒でした後一歩です宜しく御教授お願いいたします。 open(IN,"$logfile") || &error("Open Error : $logfile"); while (<IN>) { ($noo) = split /<>/, $_, 2; if ($no == $noo ) { $_ = join('<>',$no,(map{$arg_[$_]}(0..$#eqipument)),$p0,$p1,$p2,$p3,$p4,$p5,$n_article,$w_article,@reselect_marks,),'<>','\n'; } push(@new,$_); } # 更新 open(OUT,">$logfile") || &error("Write Error : $logfile"); print OUT @new; close(OUT);
補足
moon_piyoさんお世話になります 下記の様に変更して、実行しましたら、変数値が空になってしまい、 変更できないのですが、ご指摘お願い出来ないでしょうか、宜しくお願いいたします open(IN,"$logfile") || &error("Open Error : $logfile"); while (<IN>) { ($noo) = split /<>/, $_, 2; if ($no == $noo ) { $_ = ($noo,@arg_[0..$#eqipument],@p[0..5],$n_article,$w_article,@reselect_marks) = split /<>/; } push(@new,$_); } close(IN); # 更新 open(OUT,">$logfile") || &error("Write Error : $logfile"); print OUT @new; close(OUT);