• ベストアンサー

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の結果がブラウザにより変わるとは思えません。よろしくご指導ください。

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

  • ベストアンサー
  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.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

_rakuda_
質問者

お礼

正しくないHTMLを吐き出していたのですね。 おかしなHTMLをIEとFirefoxが別の解釈をしていたということで理解しました。 ありがとうございます。 解決ということでご協力感謝します。

その他の回答 (1)

  • dezimac
  • ベストアンサー率56% (2365/4208)
回答No.1

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;} のようにしてみてください。

_rakuda_
質問者

補足

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;の追記でスクリプト自体は現在意図したとおりに働いています。)

関連するQ&A

  • JavaScriptでPerlのサブルーチンを呼び出すには?

    JavaScriptでPerlのサブルーチンを呼び出すことはできますか。 #Perl Sub Func_a(){ ... } この Func_a 関数をJavaScriptから呼び出したいのです。

  • javascriptの中で、perlのコマンドを実行できないか。

    javascriptの中で、perlのコマンドを実行できないか。 java:クライアント側の処理。 perl(cgi):サーバ側の処理。 なので、愚問かもしれないのですが、 ↓====================================== <script language="JavaScript"> <!-- function aaa(){  : EOM (この間に、perlの処理) print <<EOM; : } // --> </script> ↑====================================== と言った感じで、javascriptのfuncitonの中で、 perlを使って、データベースへの操作をしたいのですが、 やはり、無理でしょうか。 あるいは、代案などあればご教授願えませんでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • perl  TermExtract 動かない

    perl で TermExtract というものを使って専門用語抽出をしたいと思っています。 参考ページ http://gensen.dl.itc.u-tokyo.ac.jp/termextract.h … 形態素解析ソフトは「和布蕪」を使っています。 参考ページの 「和布蕪」の場合の、TermExtract::MeCab サンプルスクリプトを参考にして 動かしてみたんですがうまく動作しません。 <ソース> #! /usr/bin/perl use TermExtract::MeCab; my $data = new TermExtract::MeCab; my $InputFile = "./CGI/mecab_out.txt"; $SIG{INT} = $SIG{QUIT} = $SIG{TERM} = 'sigexit'; my $output_mode = 1; my @noun_list = $data->get_imp_word($InputFile); print "Content-type: text/html; charset=EUC-JP\n\n"; print <<"EOM"; <!DOCTYPE html> <HTML> <HEAD> <TITLE>mecab</TITLE> </HEAD> <BODY> EOM foreach (@noun_list) { # 結果表示 printf "%-60s %16.2f\n", $_->[0], $_->[1] if $output_mode == 1; printf "%s\n", $_->[0] if $output_mode == 2; printf "%s,", $_->[0] if $output_mode == 3; } sub sigexit { $data->unlock_db; } print <<"EOM"; </BODY> </HTML> EOM <---------------> mecab_out.txtには、和布蕪」を使って出食された形態素解析済みのデータ が入っています。 ブラウザでみると、真っ白のページが表示されます。 なにか使い方を間違えているのでしょうか? よろしくお願いいたします。

  • FireFoxでfocus()が上手く動かない

    javascriptを使って、 フォームのテキストエリアの入力文字数をチェックし、 オーバーしていれば、アラートを出し、テキストエリアにフォーカスを移動させる。 ようにしようとしています。 IEでは動いてのですが、FireFoxだと上手くフォーカスが移動してくれません。 どこがまずいのか、教えてください。 コード <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <script type="text/javascript"> <!-- function checkText(aText) { if (aText.value.length > 1) { alert('サイズオーバーです'); aText.focus(); } } //--> </script> </head> <body> <form method="post" action="#"> <input type="text" name="fmTitle" onBlur="checkText(this)"> <input type="text" name="dummy"> </form> </body> </html>

  • ブラウザの種類によって、処理を分岐。

    ブラウザの種類によって、処理を分岐。 以下のような感じで、ブラウザの種類(SAFARI、OPERA、FIREFOX、EXPLORERなど)によって、 perlの処理を分けたいのですが、やり方がわかりません。 (もちろん、以下は、正常に動作しません。) //↓=========================================== <script language="JavaScript"> <!-- window.onload = function(){ str = navigator.appName.toUpperCase(); if (str.indexOf("SAFARI") >= 0) browser_Name = "SAFARI"; if (str.indexOf("NETSCAPE") >= 0) browser_Name = "NETSCAPE"; if (str.indexOf("OPERA") >= 0) browser_Name = "OPERA"; if (str.indexOf("FIREFOX") >= 0) browser_Name = "FIREFOX"; if (str.indexOf("EXPLORER") >= 0) browser_Name = "EXPLORER"; if (str.indexOf("MICROSOFT") >= 0) browser_Name = "EXPLORER"; if (browser_Name == "SAFARI"){ EOM $a="1"; print <<EOM; } if (browser_Name == "NETSCAPE"){ EOM $a="10"; print <<EOM; }  : } // --> </script> //↑=========================================== どうかご教授願います。よろしくお願いします。

    • ベストアンサー
    • Perl
  • ファイヤーフォックスでCSSが読み込まれません

    会社のホームページを担当していて困っています。 IEでは、きちんと表示されるのですが ファイヤーフォックスですとCSSを認識してくれないようです。 下記が自分会社のソースです。 何が悪いのでしょうか? よろしくお願いいたします。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html lang="ja"> <head> <title></title> <meta http-equiv="Content-Style-Type" content="text/css"> <meta http-equiv="Content-Script-Type" content="text/JavaScript"> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <SCRIPT language=javascript src="js/libs.js" type=text/javascript></SCRIPT> <meta name="ROBOTS" content="ALL"> <<link href="css/stylesheet.css" rel="stylesheet" type="text/css" media="all"> </head>

  • 「Learning Perl」(第4章、問3)

    Perl初心者です。 「Learning Perl」(オライリー社、第5版)を勉強中なのですが、4章の練習問題3でつまずいています。 #!/usr/bin/perl use strict; sub total { my $sum; foreach (@_) { $sum += $_; } $sum; } sub average { if(@_ == 0) {return} my $count = @_; my $sum = total(@_); $sum/$count; } sub above_average { my $average = average(@_); my @list; foreach my $element (@_) { if($element > $average) { push @list, $element; } } @list; } my $average = average(100, 1..10); print "\$average = $average\n"; my $barney = above_average(100, 1..10); print "\$barney = $barney\n"; とやったのですが、結果が $average = 14.0909090909091 $barney = 1 となってしまいます。 ($averageの値は正しいのですが、$barneyの値が100となってほしいのに、1になってしまっています。) すみませんが、識者の方、どこが悪いのか、ご教授お願いします。

    • ベストアンサー
    • Perl
  • FireFoxだけちゃんとうごいてくれないです

    いつもお世話になっています。 Javascriptでメニューを閉じたり開いたりさせたくて難儀してます。 <script type="text/javascript"> <!-- // ツリーメニュー flag = false; function treeMenu(tName) { tMenu = document.all[tName].style; if(tMenu.display == 'none') tMenu.display = "block"; else tMenu.display = "none"; } //--> </SCRIPT> <li class="li> <a href="javaScript:treeMenu('treeMenu')">メニュー</a> </li> <DIV id="treeMenu" style="display:none"> <li class="li_sub"> <a href="index.html"> 小メニュー1 </A> </li> <li class="li_sub"> <a href="index.html"> 小メニュー2 </A> </li> </DIV> こんな感じでクリックすると小メニューが出てさらにクリックで非表示になるようにしています。 IE8やGoogleChromeですとうまくいきます。 (Safariではまだ試していません。) が・・・ FireFox3ではウンともスンともいいません。 記述自体がFirefox3では受け付けないのでしょうか? 根本的に考え方が違うぞ!とか そういったご意見でもかまいません。 どうかお助けください。 よろしくお願いいたします。

  • ファイヤーフォックスでCSSが機能しません

    会社のホームページを担当していて困っています。 IEでは、きちんと表示されるのですが ファイヤーフォックスですとCSSを認識してくれないようです。 下記が自分会社のソースです。 何が悪いのでしょうか? よろしくお願いいたします。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html lang="ja"> <head> <title></title> <meta http-equiv="Content-Style-Type" content="text/css"> <meta http-equiv="Content-Script-Type" content="text/JavaScript"> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <SCRIPT language=javascript src="js/libs.js" type=text/javascript></SCRIPT> <meta name="ROBOTS" content="ALL"> <<link href="css/stylesheet.css" rel="stylesheet" type="text/css" media="all"> </head>

  • チェックボックスONでジャンプ

    javascript初心者です。 現在チェックボックスをONにすると別の商品のページにジャンプするという シンプルなものを作っているのですが、Chromeではきちんと動作するのに、 その他のブラウザ(firefox opera ie)で動作しません。 <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Script-Type" content="text/javascript"> <script type="text/javascript"> <!-- function chkClick() {  if (formTest.chkTest.checked) {   location.href="item123.html";  } } //--> </script> </head> <body> <form act="test.cgi" id="formTest" method="post"> <input type="checkbox" name="chkTest" value="1" onclick="chkClick()"> </form> チェックを入れると商品123のページへ </body> どこか記述が間違っているところがありますでしょうか? ご指摘頂ければ助かります。よろしくお願い致します。

専門家に質問してみよう