エラーが出る理由とは?

このQ&Aのポイント
  • 掲示板製作中にエラーが発生しています。エラーメッセージは「my変数が同じスコープ内で以前の宣言をマスクしている」というものです。
  • 変数名を変更したはずなのに以前の変数名でエラーが表示されています。また、現在使用中の変数名でもエラーが出ますが、その行では変数を使用していません。
  • エラーの意味は「同じ名前の変数が存在する」ということです。変数名は修正したはずですが、直接CGIを実行してもブラウザには表示されません。
回答を見る
  • ベストアンサー

エラー

ただいま掲示板を製作中なのですが、 コマンドプロンプトでチェックしたところ "my" variable 変数 masks earlier declaration in same scope at ××××.cgi line…. とのエラーが出ます。 おかしなことにサブルーチン内で重複していたため変数名を変えたはずの以前の変数名でエラー表示になっています。 また現在使用中の変数名でのエラーも出るのですが、以前の変数、使用中の変数のエラーとも指摘されたlineの行では使用してません。 エラーの意味は「同じ名前の変数がありますよ。」ってことなのでしょうか?確かに同じ名前を使ってしまっていたのですが現在は修正したので問題ないはずです。 現在はネットで頂いてきた「Perl CGI Script 実行チェックプログラム」ではエラーなくブラウザに表示されるのですが、直接CGIを実行してもブラウザには表示されません。 なにを修正すればいいのかまったく検討がつきません。 どなたかご教授願いませんでしょうか?

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

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

  • ベストアンサー
  • hkd9001
  • ベストアンサー率48% (99/204)
回答No.3

tetsu222 さん、おはようございます。 (スクリプトのサンプルもありがとうございました) さて私の申し上げた「myを使わなくてすむスクリプト」ですが、これは「グローバル変数だけを使ったスクリプト」という意味なのでした。このことによりスコープを気にする必要がなくなるので、その分ロジックのほうに集中できる、というメリットがありますね~(私の経験から)。掲示板を作られているということですが、これってロジックがある程度込み入ってますよね~。 あと、書いてくださったコードについては、特に問題は無さそうですが…「my」の後にカッコ「(…)」がついているのは初めて見ました。これってエラーにならないんですね…。あ、余談でした(笑)。 …ご参考になれば幸いです。もし追加でご質問あれば、どうぞ。

tetsu222
質問者

お礼

hkd900さん、ありがとうございます。 まずは変数名を整理してみようと思います。 さすがにファイルが違えば同じ変数名でも大丈夫ですよね? requireのものまでとなるとちょっとへこみます。 変数が多くなると名前をつけるので考え込んでしまうときがあるので(笑) 余談ですが、myの()「カッコ」ですが値を複数渡すときに使用してます。 &SUB($AA,$BB,$CC,@DD); ↓ subSUB{ my($AA,$BB,$CC,@DD)=@_; ってな感じです。 こんなときは()カッコなしでも良いのかな? たしか参考にした本にこう書いてあったのでまったく違和感なく使ってました(笑)

その他の回答 (2)

  • hkd9001
  • ベストアンサー率48% (99/204)
回答No.2

tetsu222 さん、レスありがとうございます。  では次に、このスクリプト全体でみた場合(今度は、スコープは考えない)、「my」で宣言されている変数にダブリがあるかどうか見てみてください。  もしあれば、それが原因と考えられるので、ダブらないような手立てをしてみてください。  反対に、ダブリがないのであれば、そもそも「my」を使わなくてすむようにスクリプトを修正してしまうのが早いかも。 …これで うまく解決できるといいのですが…

tetsu222
質問者

お礼

付けたしです。 &SUB($AA); ↓ sub SUB{ my($AA)=@_; } としてます。

tetsu222
質問者

補足

ご丁寧にありがとうございます。 サブルーチンに値を渡すときは渡す側と受け取り側を同じ変数名にしているのですが、もしかしてそれがいけないのでしょうか? myで宣言しているのでサブルーチンが違えばいいのかと思ってました!もともとlocalはぜんぜん使ってませんが・・・。 それを直すとするとかなりダブりがあるのでちょっと時間がかかるかもしれません。がんばってやってみます。 ちなみにmyを使わないスクリプトとはすべてlocalで宣言すると言うことでしょうか?

  • hkd9001
  • ベストアンサー率48% (99/204)
回答No.1

tetsu222 さん、こんにちは。 さて、スクリプトの詳細を拝見しないと何とも言えないのですが、まず… 「my」などで変数を宣言している部分がお有りかと思うのですが、同じものが2つ書かれていないかチェックしてみては如何でしょうか? ちなみにエラーの意味は「"my"変数<変数名>が、同じスコープ(有効範囲、と考えてください)の中での より早期の宣言とカブッている」みたいな感じですね。

tetsu222
質問者

補足

hkd9001さん、こんにちは。 スコープとはその変数の有効範囲ということですよね? エラーで指摘されている変数名は指摘された行があるサブルーチン内では現在使用してません。よって、宣言もしてないのです。確かに以前は使用していたのですが、変更しました。ほかのサブルーチンでは使用しているのですが、そっちまで関係しているのでしょうか?

関連するQ&A

  • CGI Error

    以前に同様の質問があったのですが、解決はされていなかったため再度質問させてください。 Windows 2000 Professional(service pack4)上でIIS5.0を使い実行ファイルを呼び出してCGIを作成しているのですが、 「CGI Error The specified CGI application misbehaved by not returning a complete set of HTTP headers. The headers it did return are: 」 (are:の以下には何も無い) とブラウザに表示されて動きません。 Default.htmのあるフォルダにjava scriptファイルがあり、その中で別フォルダにある実行ファイルを呼び出しております。 実行ファイルのあるディレクトリは読み取り、ASP等のスクリプトを実行する、ISAPIアプリケーションCGI等を実行するにのみチェックをいれ仮想ディレクトリ作成ウィザードで作成しました。 実行ファイルのあるディレクトリ以外のディレクトリは読み取りのみチェックで同様に作成しました。 ファイル名などに間違いはありません。 以前の同様の質問をされた方への回答で 「CGIの最初の出力に「Content-Type: text/html」と「1行の空白行」が必要」とありましたが、 これについては入っていました。 また、今回CGIエラーとなるシステムは、 以前別の環境で動作していたものを今回引継ぎ、新しい端末にて同様に設定しただけで、今回新たにソース変更を行っていません。 どうぞよろしくお願いします。

  • CGI ErrorでCGIが動かない。。

    Windows2000上で、IISでCGIを動かそうとしているのですが、 「CGI Error The specified CGI application misbehaved by not returning a complete set of HTTP headers. The headers it did return are: 」 (are:の以下には何も無い) とブラウザに表示されて動きません。何が考えられますか? 実行権限も与えているし、ファイル名を間違ってもいないのですが・・・

    • 締切済み
    • CGI
  • "Internal Server Error"が表示され困っています。

    http://www.futomi.com/lecture/macosx/prepare.html のページを参考にApacheでCGIを実行してみようとしているのですが、 ■ CGI を実行させてみましょう の手順で、printenv.cgiに拡張子を変更、 ターミナルから、パーミッションを変更して、 ブラウザーのアドレス欄に、http://127.0.0.1/cgi-bin/printenv.cgi を入力したのですが"Internal Server Error"と 表示されてしまいます。 ターミナルからパーミッションを変更しないでhttp://127.0.0.1/cgi-bin/printenv.cgiを参照したときとは ブラウザ表示内容が変わっているため、パーミッションの変更はうまくいっていると思うのですが何かほかに原因が思い当たる方がいましたらおしえてください。 よろしくお願いいたします。

    • ベストアンサー
    • Mac
  • SSIでのエラーについて

    こんばんわ。 RedHat7.2で、Perlで、CGIの勉強をしはじめましたが、 SSIが どうもうまくいきません。 CGIならうまくいくのですが、HTMLからSSIでCGIを実行しようと するとうまくいきません。 Apacheで練習しているのですが、Apacheの設定が悪いのか、ほかに 重大なミスをしてるのかわかりません。 HTMLの中に #exec cgi を入れてみたんですが、 ブラウザにはその部分が [an error occurred while processing this directive] と表示されるだけなんです。 ごくごく簡単なカウンターなんですが。。。 SSIにおいて、これだけは必ずしなければだめ、というのが あれば教えていただきたいのですが。。。 よろしくお願いいたします。

  • 404エラー

    サイト内リンクで404エラーが出て困っています。 サーバーはapachでブラウザーはchromeです。 トップページから別ページにリンクを張っていますが404エラーがでます。 以前はエラーが出ませんでしたが ソースを見たらファイル名にドメイン名がついていました。 サーバー上で修正して確認するとリンクしますがログアウトしてwebサイトで確認するとリンクできません。 ソースを見ると修正されていません。 サーバー上では修正ができています。 よろしくお願いいたします。

  • なんでサーバーエラー??

    CGIをはじめて、まだまだ初心者です。 プログラムは、MS-DOSで構文チェックして、 OKとでるのに、サーバーエラーっておかしくないですか? もちろん、サーバは、自分のパソコンに アパッチいれて、Perlいれて確認するんですが、 何がエラーなんでしょう・・・? まだ、高級なCGIなど作れないので、 フリーのスクリプトをDLしてきました。 まず、構文チェックOK。 そして、Perl開いたまま、 ブラウザにアクセスします。 そうしたら、サーバーエラーとなるのです。 何を変えていったらいいのか教えて下さい。 (自分で作った簡単なアンケートフォーム とかは成功しました)

    • ベストアンサー
    • CGI
  • QGISのジオメトリエラーについて

     QGISにてジオメトリ整合性チェックをかけて、エラー内容の修正をかけております。 ポリゴンの自己交差のエラーについては、ノードの位置を変更してエラーを解消できたのですが、 エラー内容「ポリゴン1内部ポリゴン0」というエラーは、本来エラーをクリックすると、そのエラー位置を 表示するはずですが、このエラーをクリックすると、「Pythonプログラムを実行中にエラーが発生しました」というメッセージが出て、エラー位置が表示されません。 また地物の番号から、該当する地物を確認しましたが、何がエラーなのか分かりません。 どうすればこのエラーが解消出来るのか、ご存知の方がいらっしゃいましたら御指導願います。

  • javascriptのopenerでエラー

    naritanと申します。 現在、ファイルのアップロード機能を作成しております。 親ウィンドウから子ウィンドウを開いて、開いた子ウィンドウでアップロードするファイルを選択し、ボタンを押下時にcgiを実行して実現しています。 そこで、子ウィンドウでボタンを押下した時に、選択したファイルの名前を親ウィンドウに表示したいと思い、ボタン押下時にまず、javascriptに処理を移し、openerメソッドを使用して実現しようとしているのですが、「アクセスが拒否されました」というjavascriptのエラーが表示されてしまいます。 記述は以下のようにしています。 -------------------------------------------------- window.opener.document.FORM1.file_nm.value = str2; -------------------------------------------------- ※str2:ファイル名保持変数 ※file_nm:親ウィンドウFORM1上のテキストボックス名 ちなみに親ウィンドウと子ウィンドウの拡張子は異なっているので、ためしに拡張子を合わせて実行してみたところ、ファイル名は親ウィンドウに表示されたのですが、cgiが動かなくなってしまいました。 ちなみに親ウィンドウはhtsファイル、子ウィンドウはhtmlファイルです。 お分かりになる方が見えましたら、ご教授願います。

  • Internet Explorer スクリプトエラーを表示しない方法

    Internet Explorer スクリプトエラーを表示しない方法はないでしょうか? [Internet Explorerのプロパティ]→[詳細設定]→[ブラウズ]欄 ●「スクリプト エラーごとに通知を表示する」のチェックを外しました。 ● [スクリプトのデバッグを使用しない] チェック ボックスをすべてチェックしました あと、ファイル名を指定して実行 で sfc /scannow も実行してみましたが症状が変わりません。 他に、なにかすべきことはあるでしょうか? Windows XP SP2 で、Internet Explorer のバージョン は 6.0.2900~ で最新です。

  • Internet Explorer スクリプトエラー を表示しない方法?

    Internet Explorer スクリプトエラー を表示しない方法はないでしょうか? [Internet Explorerのプロパティ]→[詳細設定]→[ブラウズ]欄 ●「スクリプト エラーごとに通知を表示する」のチェックを外しました。 ● [スクリプトのデバッグを使用しない] チェック ボックスをすべてチェックしました その上で再起動しましたが、エラーのダイアログが出ます。 あと、ファイル名を指定して実行 で sfc /scannow も実行してみましたが症状が変わりません。 他に、なにかすべきことはあるでしょうか? Windows XP SP2 で、Internet Explorer のバージョン は 6.0.2900~ で最新です。