スクリプトの繰り返しの防止

このQ&Aのポイント
  • CSVファイルを1行表示し、編集可能にするスクリプトを無限ループから防止する方法
  • 初歩的な質問ですが、レンタルサーバーを固まらせないための対策はありますか?
  • 無限ループになってしまうスクリプトを修正する方法を教えてください
回答を見る
  • ベストアンサー

スクリプトの繰り返しの防止

下記のようなスクリプトがあります。 これは、CSVファイルを1行表示し、編集可能にするスクリプトの1行表示部分です。 これを全行表示するスクリプトに変更したいと考えています。 while ($cnt) { foreach(@csv2){  .............................. } } とすると無限ループするようです。(サーバーが固まる) webで調べたのですが、$cnt = '1'or die "$!"としても抜けだせません。 行が無くなったら作業を終了するとしたいのですが、どうすればいいでしょうか? 初歩的な質問で恐縮なのですが、レンタルサーバーをこれ以上固まらせるわけ にもいかないため、ご教授頂ければと思います。 @csv2 = split(/\<>/,$csv[$param{'num'}]); $cnt = '1'; foreach(@csv2){ &trString(\$_, "1",); if($_ eq $csv2[-1]){ chomp($_); } print "<tr>\n"; print qq|<td><input type="text" name="$cnt" size="30" value="$_"></td>|; print "</tr>\n"; $cnt++; }

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

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

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

みた感じ、質問文内のスクリプトは、 (1)配列@csvから1行抽出。 (2)抽出したものを分割したものをinputコントロールとして出力。 ――としているので、全行出力するなら、@csvについてループさせる必要があります。 なので、$cntを操作しても、うまくいかないかと。 $cntは、1行を分割した個々の要素を数えるのに使っているので。 たとえば、質問文スクリプトをサブルーチン化して、@csvの各行に対してそれを呼び出すようにするとかいった方向でスクリプトを書き換えてみては。

tajix14
質問者

補足

ご回答大変ありがとうございます。 大変申し訳ございません。 当方、プログラマではなく、落ちてるCGIを弄る程度しか出来ず、基本的なことを学んでおりません。 サーバーが固まっても構いませんので、ざっくりとしたやり方をご教授いただけませんでしょうか?

その他の回答 (1)

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

たとえば、こんなのとか: sub makeform_edit_csv_by_line(){ my( $csv, $line_number ) = @_; my @csv2 = split(/<>/, $csv ); my $cnt = 1; print "<tr>\n"; foreach( @csv2 ){ &trString(\$_, "1", ); if( $_ eq $csv2[-1] ){ chomp($_); } print qq|<td><input type="text" name="${line_number}_${cnt}" size="30" value="${_}"></td>|; $cnt++; } print "</tr>\n"; }

参考URL:
http://www.ideone.com/urlLA

関連するQ&A

  • CSVの一行ずつの処理

    CSVから、4データ一行のデータを読み込みテーブルに書き出し、 チェックボックスなどで編集後、 確認画面において、どこを修正したかを表示するプログラムを作っています。 とりあえず、表示はできたのですが、 編集した箇所がどこかというのを、 確認画面に渡す部分がどうしても思いつきません。 現段階でのソースは以下のとおりです。 初心者なのでお恥ずかしいソースですが、 ご教授いただけると幸いです。 my $colline; foreach (@td){ chomp; my @cols = split(/,/); print "<tr>\n"; for ($colline=0;$colline<=$max;$colline++){ if ($cols[$colline] eq ''){$cols[$colline] = "&nbsp;"} if ($colline eq 0){ #日付表示部 print "<td><div align'center'><input name='day' value='$cols[$colline]' size='15'></div></td>\n"; #修正ボタン部 print "<td><div align='center'><input type='button' value='修正' onclick='location.href=\"\"'></div></td>\n"; } elsif ($colline eq 1){ #表示部 print "<td><div align='center'><input type='checkbox' name='checkshow' value='S' $show ></div></td>\n"; } elsif ($colline eq 2){ #削除部 print "<td><div align='center'><input type='checkbox' name='checkdel' value='D' $del ></div></td>\n"; } } print "</tr>\n"; }

    • ベストアンサー
    • Perl
  • 指定のフォルダに指定のファイルがあったら画像を表示、なければ飛ばすいい方法(CGI)

    指定のフォルダに指定のファイルがあったら画像を表示、なければ飛ばすというようにしたいのです。 opendir (FOLDER,"img"); @FOLDERS = readdir (FOLDER); closedir(FOLDER); my ($cnt) = 0; foreach(@FOLDERS) { if ($_ =~ /.+\..+/) { $cnt++; } } $tate = $cnt/10; print "<TABLE CELLSPACING=0 CELLPADDING=2>\n"; print "<TR>\n"; for($i=1;$i<11;){ for($n=2;$n<$cnt;$n++){ $F = $FOLDERS[$n]; if("$i.jpg" eq "$F"){ print "<TD CLASS=TD1><IMG SRC='img/$i.jpg' HEIGHT=65 WIDTH=50><BR>$i</TD>\n"; $i=$i+1; } #if } #for $n } #for $i というようにしてみたのですが時間がかかりすぎてしまいます。 何かいい方法はないでしょうか?

    • 締切済み
    • CGI
  • サブルーチンの受け渡しについて

    以前からいろいろな質問をさせて貰い、 沢山の方に助けてもらったことをまず感謝いたします。 sub html1:{ &serch();#ファイル検索 print qq|Content-type: text/html\n\n|; print qq|<HTML><HEAD><TITLE>ファイル選択</TITLE></HEAD><BODY>\n|; print qq|<BODY text="#660000" bgcolor="#f0f0f0" link="#be7e7e" vlink="#c8c891" alink="#b3b3d9">\n|; print qq|<CENTER>\n|; print qq|<FORM action="edit.cgi" method="GET">|; print qq|<TABLE border="1" width="350" height="100">\n|; print qq|<TBODY>\n|; print qq|<TR>\n|; print qq|<TD colspan="4" height="85" align="center" valign="middle" width="300">|; print qq|<center>テキスト編集プログラム</center></TD>|; print qq|</TR>|; print qq|<TR>|; print qq|<TD colspan="4" align="center">ファイルを選択してください。<BR>|; print qq|<BR>|; print qq|<SELECT name="filename" size="1">|; foreach $file(@filelist){ print qq|<OPTION value="$file">$file</OPTION>\n|; } print qq|</SELECT><BR><BR>|; print qq|</TD></TR>|; print qq|<TR>|; print qq|<TD colspan="4" align="center"><INPUT type="submit" value="決定"></TD>|; print qq|</TR>|; print qq|</TBODY>|; print qq|</TABLE>|; print qq|</FORM>|; print qq|</CENTER>|; print qq|</BODY></HTML>\n|; サブルーチンの受け渡しが勉強が良くわからず、まだ勉強不足なので 申し訳ありませんがどうしたら良いのでしょうか? (ここから編集ルーチンにファイル名を送る手段) あとわかりやすい参考になるサイトなど御座いましたらよろしくお願いします。

    • ベストアンサー
    • Perl
  • Rubyのスクリプト

    Rubyを使って、ディレクトリを順に処理していくスクリプトを作ろうとしています。 下記は、perlのものです。 chdir("C:/data"); opendir(DIR, "./"); @myfolderlist= grep(-d, readdir(DIR)); close(DIR); foreach $myfolder(@myfolderlist){ if(($myfolder ne ".") && ($myfolder ne ".." )){ print "$myfolder\n"; } } これに対応するような、かつRubyらしい(foreachを使う)スクリプトを作りたいと考えます。 Dir.foreach('C:/Data'){|item| item.chomp! print item,"\n" } 上記のRubyスクリプトの問題は、ディレクトリのみならず、そこに存在するファイルまで出してしまいます。 Rubyにおいて、ディレクトリ」のみを持ってくるには、どのようにすれば良いでしょうか? 宜しくお願いいたします。

  • 複数のCSVファイルを1つの表にして出したい

    あるCSVファイルを、Perl+HTMLで、プラウザに「表」で表示させるようにしました。 しかし、追加で複数のCSVファイルを読み込ませて、同じ表に入れることができません。(今ある表のなかの、$r1,2,3と番号が存在してる以外の空欄になっている表に入れたいのです) どのようにすればいいのか、どなたかお教え下さい!>< ちなみに、今作ってあるものはこんなかんじです。 動作確認済み。 #!/usr/local/bin/perl #----------------------------------- $file = "a.20090504.csv"; #----------------------------------- print "Content-type: text/html\n\n"; print "<html>\n"; print "<body>\n"; print "<br><br>\n"; print "<center>\n"; print "<table border=1 >\n"; $days = $file; $days =~ s/a.//g; $days =~ s/.csv//g; open(IN,"$file"); @kasou = <IN>; close(IN); foreach $line (@kasou){ ($r1, $r2, $r3, $r4, $r5, $r6, $r7) = split (/,/, $line); print "<tr>\n"; print "<td>$days</td>\n"; print "<td>$r1</td>\n"; print "<td></td>\n"; print "<td>$r2</td>\n"; print "<td></td>\n"; print "<td></td>\n"; print "<td>$r3</td>\n"; print "<td></td>\n"; print "<td></td>\n"; print "<td>$r4</td>\n"; print "<td>$r5</td>\n"; print "<td>$r6</td>\n"; print "<td>$r7</td>\n"; print "</tr>\n"; } print "</table>\n"; print "</body>\n"; print "</html>\n"; ※ちなみに、これですとCSVファイル名の20050504だけがtrに入るようになっています。これは、こうしたいのでこうしているのですが、繰り返しtrに投入されるようになっているのも気になります。 どうしたら直るでしょうか。

  • うまく変数を当てられない?

    フォーム部分を作成中です。 画像が設定されたフォルダにあり、それを選択すると言うことをしたいと思っています。また、以下は修正画面です。 ディレクトリ内のファイルを読み込み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」が付いています。 これはどう修正したらいいでしょうか?

  • フリーCGI ラジオボタンの改行についてです。

    色々調べましたが、どうしても分からなかった為質問させて頂きます。 http://cgikon.com/search/detail.php3?cgi_id=308 こちらのフリーCGIをお借りして、アンケートを作成することになりました。 質問は、ほぼラジオボタンによる3択です。 デフォルトだと、ラジオボタンは横並びになっているのですが 質問内容が長過ぎるため、見づらくなってしまいます。 その為、ラジオボタンを添付画像のように改行したいと思っております。 おそらく、下記のどこかを変更すればいいとは思うのですが 分かりませんでした…。 # アンケート質問の表示 my($number) = 0; foreach (@question) { ($qtype,$qname,@column) = split(/\t/); next if($qname eq ""); $number++; $key = "Q".$number; print qq! <TR> <TD NOWRAP VALIGN="top"><B>【質問$number】</B></TD> <TD>$qname</TD> </TR> <TR> <TD> </TD> <TD> !; if($qtype =~ /LISTBOX/i) { print qq!<SELECT NAME="$key" SIZE=1>!; foreach (@column) { next if(!$_); print qq!<OPTION VALUE="$_">$_!; } print qq!</SELECT>!; } elsif($qtype =~ /RADIO/i) { foreach (@column) { next if(!$_); print qq!<INPUT TYPE="radio" NAME="$key" VALUE="$_">$_!; } } elsif($qtype =~ /TEXTAREA/i) { print qq!<TEXTAREA NAME="$key" COLS=50 ROWS=5></TEXTAREA>!; } elsif($qtype =~ /TEXTBOX/i) { print qq!<INPUT TYPE="text" NAME="$key" VALUE="" SIZE=50>!; } print qq! </TD> </TR> !; } 配布元のサイト様が今月末で閉鎖される為 それに伴い、個別でカスタマイズなどの依頼対応も出来ない状態です。 申し訳ございませんが、どなたか詳しい方 ご教授頂ければ幸いです。どうか宜しくお願い致します

    • ベストアンサー
    • CGI
  • CGIでの表示の不具合について。

    座席表を作成しようと思い以下のようにしました。 最初の画面で行と列の数を入力。    ↓ その分でテーブルを作成し、入力画面を出す。    ↓ 名前と一緒に数字も入れ、机の向き(1:横向き、2:縦向き)も入力する。    ↓ 完成。 ある程度はうまくいくのですが、なぜか一定のものだけ表示がおかしくなります。 ┏━━━┳━━━━┳━┓ ┃    ┃      ┃  ┃ ┣━━━╋━━━━┫  ┃ ┃    ┃      ┃  ┃ ┗━━━┻━━━━┻━┛ とならなければならないところが ┏━━━┳━━━━┳━┓ ┃    ┃      ┃  ┃ ┣━━━╋━━━━┫  ┣━━┓ ┃    ┃      ┃  ┃   ┃ ┗━━━┻━━━━┻━┻━━┛ となることがあります。 この右端のものは全然関係ない行のログからひっぱられてきます。 でも出るものと出ないものがあります。 表示のコードは $gyou = @FILES; for($i=0;$i<$gyou;$i++){ @log = split(/&/,$FILES[$i]); foreach(@log){ ($key,$value)=split(/=/,$_); $FORM{$key} = $value; } if ($searchkey eq $FORM{'BUSYO'}){ last; } }#for終わり でログファイルを開いて分解し、 for($n=0;$n<$TATE;$n++){ print "<TR>\n"; for($r=0;$r<$YOKO;$r++){ if ($FORM{"NO$n$r"} eq '1'){ print "<TD COLSPAN=2 CLASS=TD WIDTH=100 HEIGHT=50 ALIGN=CENTER>$FORM{\"NAME$n$r\"}</TD>\n"; } elsif ($FORM{"NO$n$r"} eq '2'){ print "<TD ROWSPAN=2 CLASS=TD WIDTH=50 HEIGHT=100 ALIGN=CENTER>$FORM{\"NAME$n$r\"}</TD>\n"; } } #列の終了 print "</TR>\n"; } #行のfor終了 のように表示させています。

    • ベストアンサー
    • CGI
  • 不明の「1」が出る。

    CGIファイルを実行させると必ずといっていいほど、最後に「1」が表れます。 これは一体何なのでしょうか? なぜ出てくるのでしょうか? 現在以下のようなものを作成したのですが、 if条件であってたばあい、表示されたときに、1が複数出てしまって見栄えが悪いです。 これを消す方法を教えてください。 print "<TABLE CELLSPACING=1>\n"; print "<TR>\n"; print "<TD CLASS=TD1 WIDTH=100>名前</TD>\n"; print "<TD CLASS=TD1 WIDTH=100>ふりがな</TD>\n"; print "<TD CLASS=TD1 WIDTH=100>内線番号</TD>\n"; print "</TR>\n"; for ($i=0;$i<$gyou;$i++){ @log = split(/&/,$FILES[$i]); foreach(@log){ ($key,$value) = split(/=/,$_); $FORM{$key} = $value; $FORM{'SYOZOKU'} =~ s/\n$//g; } if ($searchkey eq $FORM{'SYOZOKU'}){ print &ok;} } sub ok{ print "<TR>\n"; print "<TD CLASS=TD1 HEIGHT=20>$FORM{'NAME'}</TD>\n"; print "<TD CLASS=TD1 HEIGHT=20>$FORM{'KANA'}</TD>\n"; print "<TD CLASS=TD1 HEIGHT=20>$FORM{'BANGOU'}</TD>\n"; print "</TR>\n"; } print "</TABLE>\n"; print "</BODY>\n"; print "</HTML>\n";

    • ベストアンサー
    • CGI
  • CGI コメント欄の文章を行替えしたいのです

    お世話になります。 野球スコアボードのCGIなのですが、コメント欄の文章がどうしても1列になってしまい、行替えができません。 文章で<br>を書き加えると、1行分のみしか表示されず、改行の2行目以降が表示されません。   以下の構成でどのようにすれば、文章の行替えが可能になりますか? アドバイスよろしくお願い致します。 <tr><td colspan=\"2\"> <font color=white>スコアボード<center> <table border=\"1\" bgcolor=\"#009933\" cellspacing=0 bordercolor=\"black\"> "; for($i=0;$i<@score;$i++){ print "<tr>"; @team_score=split(/,/,$score[$i]); if($i eq 0){ print "<tr>"; for($s=0;$s<@team_score;$s++){ if($s eq 0){ print "<td width=80> <font color=\"white\"> <center><i>チーム名 </td>"; }else{ print "<td width=\"20\"> <font color=\"white\"> <center><i>$s </td>"; } } print "<td width=40><font color=\"white\"><center><i>合計</td>"; print "</tr><tr>"; } $point=0; for($j=0;$j<@team_score;$j++){ print "<td><font color=\"white\">"; print"<center>"; if($team eq $team_score[$j]){ print "<b>" } print"$team_score[$j]</td>"; if($j eq 0){ }else{ $point=$point+$team_score[$j]; } } if($cnt[$i-1] eq $j || $i eq 0){ print "<td><font color=\"white\"><center>$point</td>"; }else{ print "<td> <font color=\"white\"><center>× </td> <td> <font color=\"white\"><center>$point </td>"; } print "</tr>"; $cnt[$i]=$j; } print "</table><p></td></tr>"; print "<tr><td bgcolor=\"#778899\" height=100> <font color=white>コメント </td> <td bgcolor=\"#f8f8ff\"> $cmt[$p] </td></tr>"; print "</table>"; print "<p><hr width=500><p>"; } } print " </body></html>"; exit;

    • ベストアンサー
    • CGI

専門家に質問してみよう