質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Q&A

解決済

2回答

2427閲覧

ホームページでクイズを作成したいのですが。

oshibuchiryo5

総合スコア11

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

0グッド

0クリップ

投稿2016/07/25 23:06

こんにちは。
ホームページ,全くの初心者なのですが,ホームページ上でクイズを作成し,その記録を保存できないかと考えています。sawa's factory というホームページでファイルが公開されており,そちらで作成を考えていたのですが,得点の記録の過程でエラーが発生しています。上記ホームページが更新されておらず困っており,質問した次第です。record.cgiで一行目にエラーがあるようです。どなたかご指摘いただけないでしょうか。

perl

1#!/usr/local/bin/perl 2#------------------------------------------------------------------------ 3# Quiz Generator Script Ranking+ 4# Copyright 2012 Sawa's Factory 5# http://sawa-s.com/quiz-generator-ranking.html 6#------------------------------------------------------------------------ 7use strict; 8use lib "./lib"; 9use Jcode; 10 11#一覧&ランキング&設定ファイルの指定 12my $listing_file="data/listing.dat"; 13my $ranking_file="data/ranking.dat"; 14my $config_file="data/config.dat"; 15# ------------ 設定ここまで ------------ # 16 17my %in = &read_param; 18my @rc_d=('none','month','year'); 19my @youbi = ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'); 20my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); 21$year += 1900; 22$mon += 1; 23$mon = sprintf( "%02d", $mon ); 24$mday = sprintf( "%02d", $mday ); 25$hour = sprintf( "%02d", $hour ); 26$min = sprintf( "%02d", $min ); 27$sec = sprintf( "%02d", $sec ); 28my $date="$year/$mon/$mday"; 29my $time= "$hour:$min:$sec"; 30my @d_array =(0,$mon,$year); 31 32if ($in{a} eq "lh"){&listing_html;} 33if ($in{a} eq "rh"){&ranking_html;} 34if ($in{a} eq "lr"){&listing_regist;} 35if ($in{a} eq "rr"){&ranking_regist;} 36if ($in{a} eq "lc"){&listing_clear;} 37if ($in{a} eq "rc"){&ranking_clear;} 38&output_js("alert('CGIエラー:不明な処理です');\n"); 39exit; 40 41sub listing_html { 42 my $output_data="listing_data=[\n"; 43 open(LTF,"$listing_file") or &output_js("alert('CGIエラー:ファイルオープンエラー');\n"); 44 my $i=0; 45 while (<LTF>) { 46 my ($host,$skey,$akey,$date,$time,$name) = split(/<>/); 47 if ($i > 0){$output_data .= ",";} 48 $output_data .= "[$skey,$akey,'$date','$time','$name']\n"; 49 $i ++; 50 } 51 close(LTF); 52 53 $output_data .= "];\nquiz_listing_open();\n"; 54 if ($i == 0){$output_data = "alert('一覧はまだ登録されていません。');\n";} 55 &output_js($output_data); 56 exit; 57} 58 59sub ranking_html { 60 my $output_data="ranking_data=[\n"; 61 open(RKF,"$ranking_file") or &output_js("alert('CGIエラー:ファイルオープンエラー');\n"); 62 my $i=0; 63 while (<RKF>) { 64 my ($host,$skey,$date,$time,$name,$comment) = split(/<>/); 65 if ($i > 0){$output_data .= ",";} 66 $output_data .= "[$skey,'$date','$time','$name','$comment']\n"; 67 $i ++; 68 } 69 close(RKF); 70 $output_data .= "];\nquiz_ranking_open();\n"; 71 if ($i == 0){$output_data = "alert('ランキングはまだ登録されていません。');\n";} 72 &output_js($output_data); 73 exit; 74} 75 76sub listing_clear { 77 open(LTF,">$listing_file") or &output_js("alert('CGIエラー:ファイルオープンエラー');\n"); 78 print LTF ""; 79 close(LTF); 80 if ($in{a} eq "lc"){&output_js("alert('一覧ファイルをクリアしました。');\n");} 81} 82 83sub ranking_clear { 84 open(RKF,">$ranking_file") or &output_js("alert('CGIエラー:ファイルオープンエラー');\n"); 85 print RKF ""; 86 close(RKF); 87 open(CFF,">$config_file") or &output_js("alert('CGIエラー:ファイルオープンエラー');\n"); 88 print CFF "$rc_d[$in{rc}]=$d_array[$in{rc}]"; 89 close(CFF); 90 if ($in{a} eq "rc"){&output_js("alert('ランキングファイルをクリアしました。');\n");} 91} 92 93sub listing_regist { 94 #ランキングクリアチェック 95 open(CFF,"$config_file") or &output_js("alert('CGIエラー:ファイルオープンエラー');\n"); 96 my $config = <CFF>; 97 close(CFF); 98 if ($config eq ""){$config="none=0";} 99 my ($key,$val) = split(/=/,$config); 100 101 my $r_clear=0; 102 if ($key ne $rc_d[$in{rc}]){$r_clear=1;} 103 else { 104 if ($val ne $d_array[$in{rc}]){$r_clear=1;} 105 } 106 if ($r_clear == 1){&ranking_clear;} 107 #listing登録処理 108 Jcode::convert(\$in{n}, 'sjis'); 109 my $host = &get_host; 110 open(LTF,"$listing_file") or &output_js("alert('CGIエラー:ファイルオープンエラー');\n"); 111 my @lines=<LTF>; 112 close(LTF); 113 my $addline="$host<>$in{sk}<>$in{ak}<>$date<>$time<>$in{n}<>\n"; 114 #重複しない場合 過去に登録した同じホスト名を取り除く 115 if ($in{ld} == 1){ 116 my @nline=(); 117 foreach (@lines){ 118 my ($hs,$dammy) = split(/<>/); 119 if ($hs ne $host){push(@nline, $_);} 120 } 121 @lines=@nline; 122 } 123 unshift(@lines, $addline); 124 while ($#lines+1 > $in{ln}) { pop(@lines); } 125 open(LTF,">$listing_file") or &output_js("alert('CGIエラー:ファイルオープンエラー');\n"); 126 print LTF @lines; 127 close(LTF); 128 #ランキングの順位判定 129 open(RKF,"$ranking_file") or &output_js("alert('CGIエラー:ファイルオープンエラー');\n"); 130 my @rlines=<RKF>; 131 close(RKF); 132 my $sw=0; 133 my $i=1; 134 my $rank= 0; 135 if ( $#rlines < 0 ){$rank= 1;} 136 else {$rank=@rlines+1;} 137 if ($rank > $in{rn}){$rank=0;} 138 139 my $oldrank= $in{rn}+1; 140 if ($in{rd} == 1){ 141 foreach (@rlines){ 142 my ($dhs,$dsk,$ddam) = split(/<>/); 143 if ($dhs eq $host){$oldrank=$i;} 144 $i ++; 145 } 146 } 147 148 $i=1; 149 foreach (@rlines){ 150 my ($rhs,$rsk,$dam) = split(/<>/); 151 if ($rsk <= $in{sk}){ 152 $rank= $i; 153 last; 154 } 155 $i ++; 156 } 157 158 if ($in{rd} == 1 && $rank > $oldrank){$rank=0;} 159 160 #JS送信 161 my $output_data = "cgi_rank=$rank;\nending();\n"; 162 &output_js($output_data); 163 exit; 164} 165 166sub ranking_regist { 167 #登録処理 168 Jcode::convert(\$in{n}, 'sjis'); 169 Jcode::convert(\$in{cm}, 'sjis'); 170 my $host = &get_host; 171 open(RKF,"$ranking_file") or &output_js("alert('CGIエラー:ファイルオープンエラー');\n"); 172 my @lines=<RKF>; 173 close(RKF); 174 my $addline="$host<>$in{sk}<>$date<>$time<>$in{n}<>$in{cm}<>\n"; 175 my $sw=0; 176 my $result=0; 177 my @nline=(); 178 foreach (@lines){ 179 my ($rhs,$sk,$dammy) = split(/<>/); 180 if ($sk <= $in{sk} && $sw == 0){ 181 push(@nline, $addline); 182 $sw = 1; 183 $result=1; 184 } 185 if ($in{rd} == 1 && $rhs eq $host){ 186 $result=2; 187 } 188 else { 189 push(@nline, $_); 190 } 191 } 192 if ($sw == 0 && $result == 0){ 193 push(@nline, $addline); 194 $result=1; 195 } 196 while ($#nline+1 > $in{rn}) { pop(@nline); } 197 open(RKF,">$ranking_file") or &output_js("alert('CGIエラー:ファイルオープンエラー');\n"); 198 print RKF @nline; 199 close(RKF); 200 #JS送信 201 my $output_data = "result=$result;\nranking_regist_result();\n"; 202 &output_js($output_data); 203 exit; 204} 205 206sub get_host{ 207 # ホスト名を取得 208 my $host = $ENV{'REMOTE_HOST'}; 209 my $addr = $ENV{'REMOTE_ADDR'}; 210 # ホスト名が取得できない場合、IPからホスト名を取得する 211 if ($host eq "" || $host eq $addr) { 212 $host = gethostbyaddr(pack("C4",split(/\./,$addr)),2) || $addr; 213 } 214 return $host; 215} 216 217sub read_param { 218 my ($buf,%in); 219 $buf = $ENV{QUERY_STRING}; 220 foreach ( split(/&/, $buf) ) { 221 my ($key,$val) = split(/=/); 222 $key =~ tr/+/ /; 223 $key =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg; 224 $val =~ tr/+/ /; 225 $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg; 226 $key =~ s/[<>"'&\r\n]//g; 227 $val =~ s/&/&amp;/g; 228 $val =~ s/</&lt;/g; 229 $val =~ s/>/&gt;/g; 230 $val =~ s/"/&quot;/g; 231 $val =~ s/'/&#39;/g; 232 $val =~ s/\r\n/<br>/g; 233 $val =~ s/\n/<br>/g; 234 $val =~ s/\r/<br>/g; 235 $in{$key} .= "\0" if (defined($in{$key})); 236 $in{$key} .= $val; 237 } 238 return %in; 239} 240 241sub output_js{ 242 # ヘッダ 243 print "Content-Type: text/javascript\n\n"; 244 # 送信 245 print "$_[0]"; 246 exit; 247} 248

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

1 行目にエラーがあるというのは、中身がおかしいのではなくて、そもそもそれ以前の話であることが多いです。このファイルに実行権限はちゃんと与えられていますか?

投稿2016/07/25 23:28

Zuishin

総合スコア28656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

oshibuchiryo5

2016/07/26 00:54

すいません,実行権限の確認はどのようにすれば良いのでしょうか。 配布元の説明では,CGIはすべてjavascriptで制御しておりCGIの知識は不要と書いていました。
Zuishin

2016/07/26 01:26

実行権限は一つの可能性でしかないんですが、見てみる価値はありますね。 FTP やシェルで確認できるんですが、サーバーのポリシーによって制限されている場合もあります。 お使いのサーバーのマニュアルに必ず書いてありますので、それをご覧になるのが一番早いかと。
oshibuchiryo5

2016/07/26 01:56

ありがとうございます。 お恥ずかしい話しなのですが,まだこれらのファイルをアップロードしていません。というかアップロード自体,まだしたことがありません。クイズを作成できるファイルをダウンロードして試行錯誤している段階です。この段階ではcgiが機能しないのでしょうか。そうなると根本的な間違いであるような気がします。
Zuishin

2016/07/26 03:07

エラーメッセージを見ましたが、「一行目にエラーがあります」ではなくて「エラーが一つあります」ではないですか? それにこれは Perl のエラーではなく、JavaScript のエラーだと思います。
oshibuchiryo5

2016/07/26 04:00

ありがとうございます。sawa's factoryのランキングは,すこし時間がかかりますがランキングに登録できました。やはり自分のパソコンがperlに対応していないことが原因なのかと思えてきました。
Zuishin

2016/07/26 04:14

「Uncaught SyntaxError: Invalid or unexpected token」というエラーですが、Perl ではなく JavaScript が出しているエラーです。そもそも Perl のエラーメッセージは標準エラー出力に流されるので、通常は画面に表示されないと思います。 このエラーはどこに表示されましたか?
Zuishin

2016/07/26 04:17

あと、面倒なのはわかりますが、限られた情報から類推するこっちはもっと面倒なので、ちゃんと説明してください。「エラーがあるようです」ではなく、どんな環境で(ローカルというのは初耳)、どういう手順を行うと、どこにどういうメッセージが表示されるかということです。
Zuishin

2016/07/26 04:19

何をインストールしているか、JavaScript や Perl のバージョンはいくつなのか、JQuery などのライブラリは使っているのかなど、コメント欄ではなく、質問に環境として書いておいてください。
退会済みユーザー

退会済みユーザー

2016/07/26 04:21

横レス失礼します。 @Zuishin さん きっとこの方、Perlの実行環境で実行せずに、ローカルのファイルをブラウザにそのままD&Dして開いているものと思われます。 いわゆる、アドレスバーが file://~~ の状態。
Zuishin

2016/07/26 04:31

HTTP サーバーを使っていないということですか? 確かにありそうです。
oshibuchiryo5

2016/07/26 04:32

Zuishin様 申しわけありません。確認してみます。 Kousuke_Shibuya様 まさにその状態です。
Zuishin

2016/07/26 04:39

本当にそうだったのですか。それは動かないはずです。 Apatch や Perl を適切にインストールしなければなりません。
oshibuchiryo5

2016/07/26 04:43

ありがとうございます。 予想を下回るレベルの低さで申しわけありませんでした。
退会済みユーザー

退会済みユーザー

2016/07/26 04:44

@oshibuchiryo5 さん 初心者にとって「適切な情報を…」と言われても、戸惑うこともあるでしょう。 そんなときは「スクリーンショット」をとって、回答者に見せるようにしてください。 質問者にとっては、一見無意味なことに見えても、回答者にとっては「情報の宝庫」です。
Zuishin

2016/07/26 04:51

いえいえ、私の頭が固かったようです。Kosuke_Shibuya さんの手柄です。
Zuishin

2016/07/26 04:54

なるほど スクリーンショットという手がありますね。次回こういうことがあればそれを上げて貰いましょう。
退会済みユーザー

退会済みユーザー

2016/07/26 04:57

@Zuishin さん スクショは質問者だけじゃなく、回答側でも使うと有用ですよ。なかなか書いた通りに解釈してくれない方には特に…
Zuishin

2016/07/26 04:58

そうですね。心得ておきます。
oshibuchiryo5

2016/07/26 08:14

大変丁寧な対応ありがとうございました。
guest

0

ありがとうございます。

お恥ずかしい話しなのですが,まだこれらのファイルをアップロードしていません。というかアップロード自体,まだしたことがありません。クイズを作成できるファイルをダウンロードして試行錯誤している段階です。この段階ではcgiが機能しないのでしょうか。そうなると根本的な間違いであるような気がします。

上のコメントと、前の質問の結果を合わせて考えると、perl の実行環境がないことが考えられます。
エラーメッセージを正確に記載すると回答が得られると思いますよ。

投稿2016/07/26 02:03

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

oshibuchiryo5

2016/07/26 02:13

VM148 record.cgi?a=lr&n=%93%BD%96%BC&sk=0&ak=0&ln=20&ld=1&rc=1&rd=1&rn=20:1Uncaught SyntaxError: Invalid or unexpected token エラーメッセージはこれでよろしいのでしょうか。
退会済みユーザー

退会済みユーザー

2016/07/26 03:11

前の質問に書きましたが、以下の方法でエラーを確認してもらえますか? > ちなみに、デベロッパーツールのネットワークタブを選び、ダウンロードファイルから、record.cgi を選択、 Preview か Response を選ぶと、エラーメッセージが表示されている可能性があります。そちらを見れば、問題箇所がわかるかも。
oshibuchiryo5

2016/07/26 03:58

すみません,やはりエラーは上記のようにしか表示されません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問