- ベストアンサー
Firefoxでのperl解釈
根本的な理解不足か悩んでおります。 CSSの表示チェックのため最近FirefoxとIEでサイトを確認するようになりました。 windowsXPproのsp2でIE6ではperlで作った自作スクリプトが思ったように表示されますが、Firefox2では意図したとおり表示されません。 javascriptが混じっている場合javascriptの解釈の違いでうまくいかないことがあることは理解しているつもりです。 今回のperlによる自作スクリプトにはjavascriptは含まれません。perlのみです。 perlはウェブのサーバーで実行されて結果のHTMLを返すと思っていましたが、違うのでしょうか? 教えたいただきたいことはperlやphpで作成したスクリプト(javascriptなどを含まないもの)の結果がブラウザにより違うことがあるのかどうかです。 よろしくお願いします。 参考までに上記のperlスクリプトの一部です。 変数設定など終わり最終のhtml振り分けです。 &checked; exit; 計算結果により飛び先が変わります。 sub checked{ if ($sum < 2){&resalt1;} if ($sum < 6){&resalt2;} if ($sum < 12){&resalt3;} if ($sum < 16){&resalt4;} } sub resalt1{ print <<"EOM"; <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <META HTTP-EQUIV="Refresh" CONTENT="0;URL=http://www.asaka-d.com/shindan/shindan1.html"> </head><body> </body></html> EOM } 以下 resalt2、3、4とありURLが変わっているだけです。 IEの場合とび先のサブルーチンのURLを表示し終了しますが、Firefoxの場合はsub checkdに戻り最後の判定まで行き必ずresalt4のURLに飛んでいきます。 スクリプトのつくりが甘かったのは事実です。かくresaltサブルーチンの最後にexit;を加えることで解決しました。 でもCGIの結果がブラウザにより変わるとは思えません。よろしくご指導ください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
各サブルーチンでexitをしていないそのスクリプトは結果として、次のようなおかしなhtmlを吐き出していると思われます。 (例として2つ、ですが云いたい事はわかってもらえると思います。) <html><head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <META HTTP-EQUIV="Refresh" CONTENT="0;URL=http://www.yahoo.co.jp/"> </head><body> </body></html> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <META HTTP-EQUIV="Refresh" CONTENT="0;URL=http://www.google.co.jp/"> </head><body> </body></html> で、このHTMLを実際にブラウザに読ませると、 IEでは最初のRefreshが採用されyahooに飛び、 Firefoxでは最後のRefreshが採用されgoogleに飛びました。 つまり、IEでうまくいってるように見えるのもたまたまです。(こういうおかしなHTMLの解釈でどちらが悪いも正しいもありませんので) 各サブルーチンでhtmlを出力後にはきちんとexitを入れるのが正当な対処です。 なお、処理後に別のURLに飛ばしたいだけなら、 Locationヘッダを出力するのが一般的です。 http://easycgi.xrea.jp/perltips/location.htm
その他の回答 (1)
- dezimac
- ベストアンサー率56% (2365/4208)
JavaScriptはブラウザで処理されますが、Perl等のCGIはあくまでサーバー側で処理が行われるので、ブラウザは関係ありません。 意図した通り表示されないというなら、吐き出されたHTML等の問題です。 cgiにアクセス→判断→適切なページへジャンプするHTMLを書き出す という処理ですよね。 気になるといえば、 sub checked{ if ($sum < 2){&resalt1;} if ($sum < 6){&resalt2;} if ($sum < 12){&resalt3;} if ($sum < 16){&resalt4;} } です。 ブラウザの種類を判別した値を変数$sumに入れて、それを元に処理を切り替えているようですが、 $sum = 1 だったら、&resalt1;のみで終わって欲しいという事ですよね。 そうであれば、条件式が違います。 今の条件だと、&resalt1;の処理が終わったら、次のif文に行きます。 $sum<6つまりこれにも一致するので、&resalt2;が実行されます。 IEで上手くいっているのは、$sumの値が12~15だからでしょうね。 if ($sum < 2){&resalt1;} else if ($sum < 6){&resalt2;} のようにするか if ($sum < 6 and $sum >1){&resalt2;} のようにしてみてください。
補足
dezimacさま 早速の回答ありがとうございます。 私もブラウザは関係ないと思うのですが… スクリプトの説明が不足しておりました。$sumはブラウザの振り分けではありません。 htmlの入力フォームでチェックボックスのチェック数の合計です。(厳密には項目によりウェイトのかけ方が違いますが) チェックの項目数により結果ページが4パターンに分かれるのです。 ですからIEだけうまくいくということにはならないはずです。 sub checked{ if ($sum < 2){&resalt1;} if ($sum < 6){&resalt2;} if ($sum < 12){&resalt3;} if ($sum < 16){&resalt4;} } の処理はいずれにしろまずかったです。 &resalt のルーチンで画面を表示して終了のつもりで戻ってきて処理が続くことなんて考慮していませんでした。 しかしながらIEでは処理が終了してFirefoxでは処理が終了していないような挙動です。 どうかよろしくお願いします。(繰り返しになりますがexit;の追記でスクリプト自体は現在意図したとおりに働いています。)
お礼
正しくないHTMLを吐き出していたのですね。 おかしなHTMLをIEとFirefoxが別の解釈をしていたということで理解しました。 ありがとうございます。 解決ということでご協力感謝します。