• 締切済み

ソートとフォームデータの格納について

perlを勉強して恥を承知で困っています。 先日、こちらで質問し大いに助けてもらったのですが 不甲斐ないながらどうすれば良いのか分からず、アドバイスを求めています。 ・使用言語:perl ・目的:htmlから「名前」「スコア」を入力し、 スコアが降順(高い順)に名前とスコアを表示する ランキングcgiの作成 ・現状の進行度 score.html #名前とスコアを入力するhtml ranking.cgi #ソートし、入力されたスコアをランキングに組み込む cgi-lib.plをDL ・分からない事 ソートする時、スコアを降順にするにしても、 名前をどうやってスコアと一緒に連れてソートするのか、 cgi-lib.plは(ranking.)cgiに設置すればいいのでしょうか? どうかご教授賜りたく候。 score.html --------------------- <html> <head> <title>テスト</title> </head> <body> <form action="request/ranking.cgi " METHOD="post"> 名前 : <input type="text" name="NewName"><br> スコア: <input type="text" name="NewScore"><BR> <input type="submit" value="送信"> </form> </body> </html> ranking.cgi --------------------- #!/url/local/bin/perl #データの格納 my %input; &ReadParse(\input); $nn = $input{'NewName'}; $ns = $input{'NewScore'}; #ソート my @v = {100,200,300}; my @k = sort{$b <=> $a;} @v; #受け取ったスコアとランキングとの比較 if($ns > @k[1]){ @k[3] = @k[2]; @k[2] = @k[1]; @k[1] = $ns; }elsif($ns =< @k[1] && $ns > @k[2]){ @k[3] = @k[2]; @k[2] = $ns; }else($ns =< @k[2] && $ns > @k[3]){ @k[3] = $ns; } #出力 print "結果\n" for(my $i=0;$i<@k;$i++){ print "$i位: $k[$i]<BR>\n"; }

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

みんなの回答

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.1

とりあえずスコアと名前を適当な区切り文字(たとえばタブ)で結合したものを一次元配列に格納してから、 降順にソートして、 各要素を順に区切った文字で分離表示すればどうでしょうか?

kenesu
質問者

お礼

ralf124cさん。回答ありがとうございます。 いまさらになって何聞いているんだ、と後悔しています…。 だけどとても参考になりました。今一生懸命配列について勉強しています。

関連するQ&A

  • フォームデータのcsv保存について

    お世話になります。フォームに入力されたデータを csvファイルに保存するというcgiの作成をしています。 初めてcgiを作成するので、書籍の真似をして作成した のですが、おかしいデータが保存されてしまいます。 質問の項目数は5個で以下のとおりです <FORM ACTION="./ans1.cgi" METHOD="POST"> 名前:<br> <input type="text" name="name" size=30> <br> 1:<br> <input type="text" name="a1" size=30> <br> 2:<br> <input type="text" name="a2" size=30> <br> 3:<br> <input type="text" name="a3" size=30> <br> 4:<br> <input type="text" name="a4" size=30> <br> <INPUT type="submit" value="送 信"> <INPUT type="reset" value="リセット"> <BR> </FORM> cgiの中身です。 #! /usr/bin/perl require './cgi-lib.pl'; $answer = 5; $ansfile = "kotae.csv"; &ReadParse(*in); $name = $in{'name'}; for($n = 1; $n <= $answer; $n++ ) { $a[$n] = $in{"a$n"}; } open (FILE,">>$ansfile"); flock (FILE,2); print (FILE "\"", $name); for($i = 1; $i <= $answer; $i++ ) { $a[$i] = ~ s/\"/""/g; print FILE "\"\,\""; print FILE $a[$i]; } print FILE "\"\n"; flock(FILE,8); close(FILE); print "Content-type: text/plain\n\n"; print "<HTML><BODY>\n"; print "tesuto"; print "</body></HTML>"; exit; csvファイルの中身を見ると、最初の列には、項目1で 記入したデータが入ってますが、項目2以降 は4294967295と数字が入ってます。どうも1個目の回答 欄のデータはちゃんと取得されてるのですがそれ以降の が取得されていないみたいです。 よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • フォームからデータを取得してテキストファイルに保存して表示する際の質問

    CGIかなりの初心者です。 infoseek iswebでcgi-lib.plを使って、フォームからデータを取得してテキストファイルに保存してまたそのファイルから読み込んで表示するだけのプログラムを作っているのですが、アクセスするたびにテキストファイルが空になってしまいます。以下のソースなのですが、間違いを指摘していただけないでしょうか? 尚、ひとまず、フォームの項目は3つあり、そのうちの最後だけが0か1か選択でき、他は0しか選択できないようにしています。 #!/usr/bin/perl require "cgi-lib.pl"; print "Content-type: text/html;\n\n"; # 値をテキストファイルから読み込む open (IN,"test.txt"); $aaa = <IN>; close (IN); $h = substr($aaa,0,1); $i = substr($aaa,1,1); $k = substr($aaa,2,1); print " <html> <head> <title>テスト</title> </head> <body> $h$i$k <br> <form method=\"post\" action=\"test.cgi\"> データ1<br><input type=\"radio\" name=\"h\" value=\"0\" checked=\"checked\">0<br> データ2<br><input type=\"radio\" name=\"i\" value=\"0\" checked=\"checked\">0<br> データ3<br><input type=\"radio\" name=\"k\" value=\"0\" checked=\"checked\">0<br> <input type=\"radio\" name=\"k\" value=\"1\">1<br> <input type=\"submit\" value=\"送信\"> </form> "; &ReadParse(*form); # フォームの値を取得 $fh = $form{"h"}; $fi = $form{"i"}; $fk = $form{"k"}; # 値をテキストファイルに書き出す @faaa = ("$fh","$fi","$fk"); open (OUT,"> test.txt"); print OUT @faaa; close (OUT); print " </body> </html> ";

    • 締切済み
    • CGI
  • 降順ソートができません。

    テキストボックスを画面左側に10個作成します。 テキストボックスを画面右側に10個作成し、 降順ソートボタンを作成します。 左側10個に入力された数値データを降順ソートして 右側の10個のテキストボックスに表示してください。 <?php //配列 $naNumber[0] = $_POST[naNumber0]; $naNumber[1] = $_POST[naNumber1]; $naNumber[2] = $_POST[naNumber2]; $naNumber[3] = $_POST[naNumber3]; $naNumber[4] = $_POST[naNumber4]; $naNumber[5] = $_POST[naNumber5]; $naNumber[6] = $_POST[naNumber6]; $naNumber[7] = $_POST[naNumber7]; $naNumber[8] = $_POST[naNumber8]; $naNumber[9] = $_POST[naNumber9]; //読込 echo ("<form name = naNumberList method = POST action = ./php05.php>"); echo ("<table boder = 1><tr><td>"); //入力用テキストボックスの作成 //テキストボックス名・形式(右寄せ)・配列 echo ("<input type = text name = naNumber0 style = text-align:right; value = $naNumber[0]><br> <input type = text name = naNumber1 style = text-align:right; value = $naNumber[1]><br> <input type = text name = naNumber2 style = text-align:right; value = $naNumber[2]><br> <input type = text name = naNumber3 style = text-align:right; value = $naNumber[3]><br> <input type = text name = naNumber4 style = text-align:right; value = $naNumber[4]><br> <input type = text name = naNumber5 style = text-align:right; value = $naNumber[5]><br> <input type = text name = naNumber6 style = text-align:right; value = $naNumber[6]><br> <input type = text name = naNumber7 style = text-align:right; value = $naNumber[7]><br> <input type = text name = naNumber8 style = text-align:right; value = $naNumber[8]><br> <input type = text name = naNumber9 style = text-align:right; value = $naNumber[9]> </td>"); //降順にソート rsort($naNumber); //降順ソート表示用テキストボックス //テキストボックス名・形式(右寄せ)・読込専用・配列 echo ("<td><input type = text name = naNumber0 style = text-align:right; readonly value = $naNumber[0]><br> <input type = text name = naNumber1 style = text-align:right; readonly value = $naNumber[1]><br> <input type = text name = naNumber2 style = text-align:right; readonly value = $naNumber[2]><br> <input type = text name = naNumber3 style = text-align:right; readonly value = $naNumber[3]><br> <input type = text name = naNumber4 style = text-align:right; readonly value = $naNumber[4]><br> <input type = text name = naNumber5 style = text-align:right; readonly value = $naNumber[5]><br> <input type = text name = naNumber6 style = text-align:right; readonly value = $naNumber[6]><br> <input type = text name = naNumber7 style = text-align:right; readonly value = $naNumber[7]><br> <input type = text name = naNumber8 style = text-align:right; readonly value = $naNumber[8]><br> <input type = text name = naNumber9 style = text-align:right; readonly value = $naNumber[9]> </td></tr>"); //降順ソートボタン作成 echo ("<tr><td colspan = 3 align = left> <input type = button value = '降順ソート'> </td></tr> </table> </form>"); ?> 上記のソースで、テキストボックス表示・降順ソートボタン表示までできました。 しかし、降順ソートができません。。 降順ソートの書き方をいろいろ変えてみたのですが。 どなたかご存知であれば教えてください!お願いいたします。

    • ベストアンサー
    • PHP
  • 「降順ソート⇒次に=だった場合はランダム」で抽出したい。

    perlの初心者です・・・。 以下の商品にそれぞれポイントが入っていて、 そのポイントを基準に、ランキング形式(降順で)で並ばせたいのです。 my %options = ( apple => 3, banana => 1, melon => 1, peach => 9, ); my @op_rank = sort{scalar($options{$b}) <=> scalar($options{$a})} keys %options; 自分なりに降順にするまでは書くことが出来たのですが、 もしポイントが同じものがあった場合に、ランダムで並び替えをするやり方がわかりません。 別のサブルーチンに分かれてもよいので、できるだけシンプルにかける方法がありましたら教えてください。お願いします。

    • ベストアンサー
    • Perl
  • FLASHとCGIでスコアランキング作成

    何度か質問させて頂いてます><; すみませんが今回もよろしくお願いします! 現在 なんとか自宅サーバでCGIが動くようになり、 自作のswfファイルからCGIへ、入力した名前とスコアがデータとして送信され、 そのままCGIページでその2つが表示されるようになっています 次の段階としては、 (1)CGIへ送信されたデータを、テキストファイルに保存。(スコアランキング用の保存場所なので、上書きではなく追記?でどんどん格納していきたいです) (2)テキストファイル内のデータを、ランキングなので降順にソートして、swfファイルで表示 この2つをやりたいです。 まず(1)は、 http://1art.jp/flash/le/lesson44/lesson44.htm こちらを参考にさせていただき、テキストファイルに保存するところまでは理解できたのですが、 データを区切って、文字がくっつかないように追記するやり方がわかりません・・・。 また、これはHTMLからCGIにデータを送信しているので、SWFからCGIに送りたい場合は やり方が違うのでしょうか。 (2)は この降順ソートをCGI側でやるべきなのかFLASH側でやるべきなのかがよくわかりません。 それともどちらでもいいのでしょうか? というか(2)は多分(1)を理解して作ってからじゃないとできないと思いますが・・・; とりあえず今はこんなところです・・・よろしければご助言お願いいたします!

    • ベストアンサー
    • CGI
  • 特定のデータだけををソートしたい

    POSTで渡されたデータの中から特定のデータだけを取り出しソートしたい。 例えばNo・名前・年齢のtextを数個表示してNoだけを抽出し、ソートして昇順にしたいのですが? print '<form name="form1" action="eee.php" method="POST">' . "\r\n"; for($i=0;$i<5;$i++){ print '<input type="text" name="N0'.$i.'">' . "\r\n"; print '<input type="text" name="Name'.$i.'">' . "\r\n"; print '<input type="text" name="Age'.$i.'">' . "\r\n"; } print '<input type="submit" value="送信">' . "\r\n"; print '</form>' . "\r\n";

    • 締切済み
    • PHP
  • (Perl)ReadParseによるハッシュへの格納について

    PerlのReadPerseについて質問させてください。 以下少々長いですが、過程を書きます。 <form>タグにより、入力フォームのページをHTMLで作成したとします(form.html)。 その際、<form method="post" action="form.cgi"> と入力しておいて、別途form.cgiを作成するとします。 form.htmlには、<form>タグ内のname属性で、それぞれ'weight' 'height' 'age'という三種類のデータを入力してもらって、取得するようにしています。 そして<input type="submit" value="登録">による、 登録ボタンを押すことで、 form.cgiに処理をさせるようにしています。 form.cgiの中身ですが、まず、最初の三行を書きます。 #!/usr/local/bin/perl require 'cgi-lib.pl'; &ReadParse(*form); となるのですが、わからないのが、 三行目の &ReadParse(*form); です。 サブルーチンReadParseを引数*formで、 cgi-lib.plから呼び出しているということはわかるのですが、いきなり*formという形で、ハッシュを登場させているあたりがわかりません。(この際、ハッシュ名の前の%を*に変えなければならないことは、一応知っております。理由はわかりませんが。) そこで質問なのですが、 いきなり、ハッシュであるformを登場させていいものなのでしょうか?? 以下、form.cgiの内容です。 #!/usr/local/bin/perl require 'cgi-lib.pl'; &ReadParse(*form); $name=$form{'weight'}; $sex=$form{'height'}; $megane=$form{'age'}; print "Content-type: text/html\n\n"; print "<html>\n"; print "<body>\n"; print "体重:${weight}<br>\n"; print "身長:${height}<br>\n"; print "年齢:${age}<br>\n"; print "</body>"; print "</html>"; _END_

    • ベストアンサー
    • CGI
  • ソート

    読み込むファイル(sample.txt)は、 2,jirou 5,gorou 4,shirou 1,tarou 6,mutsuo 3,saburou 下記の処理をします。 #include<stdio.h> #include<string.h> #define N 6 int sort1[N]; char sort2[N][30]; int BubbleSort(int data[N]) { int i,j,flag; do{ flag=0; for(i=0;i<N-1;i++) { if(data[i]>data[i+1]) { flag=1; j=data[i]; data[i]=data[i+1]; data[i+1]=j; } } } while(flag==1); return 0; } int main(void) { FILE *fpin; int id,h,k; printf("\n"); fpin=fopen("sample.txt","r"); if(fpin==NULL){ printf("ファイルをオープンできず!\n"); return 1; } for(k=0;k<N;k++) { h=fscanf(fpin,"%d,%s",&sort1[k],sort2[k]); if(h==EOF) break; printf("%d %s\n",sort1[k],sort2[k]); } printf("\n"); BubbleSort(sort1); for(k=0;k<N;k++) printf("%d %s\n",sort1[k],sort2[k]); return 0; } 実行結果は、 2 jirou 5 gorou 4 shirou 1 tarou 6 mutsuo 3 saburou 1 jirou 2 gorou 3 shirou 4 tarou 5 mutsuo 6 saburou 名前(sort2)もソートさせるには、どうすればいいか手ほどきをお願いします…

  • Lingua::JA::Sort::JISのソート

    お世話になっております。 Lingua::JA::Sort::JISモジュールを使用して、 五十音ソートを行ってますが、 うまく五十音ソートができません。 具体的には配列Nameの順番がほとんど変わらない状態で 出力されてしまいます。 なぜうまくソートできないのでしょうか? <環境> OS:FreeBSD 7.1-RELEASE-p15 i386 Apache:Apache/1.3.42 (Unix) mod_ssl/2.8.31 OpenSSL/0.9.8e Perl:5.8.9 モジュールの使い方はこちらを参考にしました。 http://okwave.jp/qa/q3412594.html 上記URLでは、文字コードの変換を行っていますが、 UTF-8でスクリプトを書いているので文字コードの変換は 不要と考えています。 Lingua::JA::Sort::JISモジュールは下記URLから取得し、 LinguaJASortJIS.pmへリネームし、カレントディレクトリへ設置しています。 http://cpansearch.perl.org/src/SADAHIRO/Lingua-JA-Sort-JIS-0.05/JIS.pm 以下スクリプトです。 test.cgi -- #!/usr/local/bin/perl use utf8; use LinguaJASortJIS; binmode(STDIN, ":utf8"); binmode(STDOUT, ":utf8"); print "Content-type: text/html\n"; print "Pragma: no-cache\n"; print "Cache-Control: no-cache\n"; print "Expires: Thu, 01 Dec 1994 16:00:00 GMT\n"; print "\n"; print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n"; print "<html lang=ja>\n\n"; print "<head>\n"; print "<meta http-equiv=\"Content-type\" content=\"text/html; charset=utf-8\">\n"; print "</head>\n\n"; print "<body>\n"; my @Name = ("みかん", "@なし", "ちくわ", "マルチョウ", "もも", "たまご", "シロ丸", "Pig", "てばさき☆", "ホルモン~", "ギアラ・アカセン", "ミノ", "SENMAI☆", "蜂巣", "焼きセンマイ♪", "バウムクーヘン", "MinoII", "(有)蜂巣JP", "生レバーIII"); my @NameSort; my $Jis = Lingua::JA::Sort::JIS->new; #ソート前 print "ソート前"; print "<table border=1>"; print "<tr><td>name</td><td>utf8 flag</td></tr>"; for (my $i = 0; $i <= $#Name; ++$i) { print "<tr><td>".$Name[$i]."</td><td>".utf8::is_utf8($Name[$i])."</td></tr>"; } print "</table>"; #ソート for my $Sort ($Jis->jsort(@Name)) { push(@NameSort, $Sort); } print "ソート後\n"; print "<table border=1>"; print "<tr><td>name</td><td>utf8 flag</td></tr>"; for (my $i = 0; $i <= $#NameSort; ++$i) { print "<tr><td>".$NameSort[$i]."</td><td>".utf8::is_utf8($NameSort[$i])."</td></tr>"; } print "</table>"; print "</body></html>"; -- 以上、よろしくお願いします。

    • ベストアンサー
    • Perl
  • フォーム入力をファイルに書き出す場合のセキュリティ

    メールフォームで入力された項目を csvファイルなどでサーバに残しておきたいです。 フォームの項目は名前、メールアドレスなど一般的なものです。 フォームの入力データをcgi-lib.plを使って my %input; &ReadParse(\%input); $Name = $input{'name'}; のようにして受け取っています。 csvをopen関数を使って書き残そうと思っています。 セキュリティ上問題はないでしょうか。 open関数はセキュリティ上注意しなければいけないと聞いたので 心配です。 お願いします。

    • 締切済み
    • CGI

専門家に質問してみよう