• ベストアンサー

データ削除方法について

現在以下のプログラムでデータを削除しています。 (ここから) print "Content-type: text/html\n\n"; open(IN,"<$memfile") || &error("Can't write $memfile"); flock(IN, 2); @lines = <IN>; foreach $lines (@lines) { ($seq,$name) = split("<>", $lines); if("$del" eq "$seq"){ next; }else{ $data .= $lines; } } close IN; open OUT, "> $memfile"; flock OUT, 2; print OUT $data; close OUT; print "<html>完了しました<br><a href=?mode=menu>戻る</a></body></html>"; exit; (ここまで) このプログラムでも削除出来るのですが、foreachの処理で対応するとパフォーマンスが悪いのかな? と思ってます。(ハッキリとはわかりません) 件数が多くなるとサーバーエラーになるのかな?と思ってます。 もっと効率の良い方法がありましたらと思い質問いたしました。 perlを独学で学んでいるので、見る人が見ると変なつくりだと思ってます。 以上、よろしくお願いいたします。

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

  • ベストアンサー
  • uwi
  • ベストアンサー率74% (55/74)
回答No.2

元を残しつつ効率をよくしてみました。 (ここから) print "Content-type: text/html\n\n"; open(OUT,"+<$memfile") || &error("Can't write $memfile"); flock(OUT, 2); while(<OUT>){ if(/^$del<>/o){ next; } push @arr, $_; } seek OUT, 0, 0; foreach(@arr){ print OUT $_; } truncate(OUT, tell(OUT)); close OUT; print "<html>完了しました<br><a href=?mode=menu>戻る</a></body></html>"; exit; (ここまで) perlを独学で学んでいるならソースの最初に use strict; use warnings; をおまじないとして書くといいと思います。 詳しい意味は調べてください。

hihin2003
質問者

お礼

uwiさん 回答ありがとうございます。 >元を残しつつ効率をよくしてみました。 ありがとうございます。大変勉強になります。 >use strict; >use warnings; >をおまじないとして書くといいと思います。 >詳しい意味は調べてください。 この件についても入れてみました。いろいろとエラー表示されました。 use CGI::Carp qw(fatalsToBrowser); はいれて確認しているのですけど、今回の教えていただいたものも含めてスクリプトに追加してやっていきたいと思います。 ありがとうございます。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • zxcv0000
  • ベストアンサー率56% (111/196)
回答No.1

@lines = <IN>; foreach $lines (@lines) { の2行を、 while( my $lines = <IN> ) { に替えてください。 > foreachの処理で対応するとパフォーマンスが悪いのかな 正確には、逐次入力で用が足りるので全件入力後に処理開始は非効率ということですね。 出力処理も、 $data .= $lines; の替りに print OUT $data; と書いて逐次出力にする方が良いかも知れませんが、こちらは効率より重大な事情がある場合もあって何とも言えません。 # 「エラーが無い事が確定するまでは出力を開始しない事」という要求は良くあります。 それから、自分で名前を付けた変数は my 宣言する事を強くお勧めします。

hihin2003
質問者

お礼

zxcv0000さん 回答ありがとうございます。 >正確には、逐次入力で用が足りるので全件入力後に処理開始は非効率ということですね。 なるほど、そうなんですね。勉強になります。 私の書き方だと動作はするが、非効率なんですね。 >それから、自分で名前を付けた変数は my 宣言する事を強くお勧めします。 はい。今後のスクリプトはそのようにして開発したいと思ってます。 ありがとうございます。

すると、全ての回答が全文表示されます。

関連するQ&A