- ベストアンサー
エラーが出る理由とは?
- 掲示板製作中にエラーが発生しています。エラーメッセージは「my変数が同じスコープ内で以前の宣言をマスクしている」というものです。
- 変数名を変更したはずなのに以前の変数名でエラーが表示されています。また、現在使用中の変数名でもエラーが出ますが、その行では変数を使用していません。
- エラーの意味は「同じ名前の変数が存在する」ということです。変数名は修正したはずですが、直接CGIを実行してもブラウザには表示されません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
tetsu222 さん、おはようございます。 (スクリプトのサンプルもありがとうございました) さて私の申し上げた「myを使わなくてすむスクリプト」ですが、これは「グローバル変数だけを使ったスクリプト」という意味なのでした。このことによりスコープを気にする必要がなくなるので、その分ロジックのほうに集中できる、というメリットがありますね~(私の経験から)。掲示板を作られているということですが、これってロジックがある程度込み入ってますよね~。 あと、書いてくださったコードについては、特に問題は無さそうですが…「my」の後にカッコ「(…)」がついているのは初めて見ました。これってエラーにならないんですね…。あ、余談でした(笑)。 …ご参考になれば幸いです。もし追加でご質問あれば、どうぞ。
その他の回答 (2)
- hkd9001
- ベストアンサー率48% (99/204)
tetsu222 さん、レスありがとうございます。 では次に、このスクリプト全体でみた場合(今度は、スコープは考えない)、「my」で宣言されている変数にダブリがあるかどうか見てみてください。 もしあれば、それが原因と考えられるので、ダブらないような手立てをしてみてください。 反対に、ダブリがないのであれば、そもそも「my」を使わなくてすむようにスクリプトを修正してしまうのが早いかも。 …これで うまく解決できるといいのですが…
お礼
付けたしです。 &SUB($AA); ↓ sub SUB{ my($AA)=@_; } としてます。
補足
ご丁寧にありがとうございます。 サブルーチンに値を渡すときは渡す側と受け取り側を同じ変数名にしているのですが、もしかしてそれがいけないのでしょうか? myで宣言しているのでサブルーチンが違えばいいのかと思ってました!もともとlocalはぜんぜん使ってませんが・・・。 それを直すとするとかなりダブりがあるのでちょっと時間がかかるかもしれません。がんばってやってみます。 ちなみにmyを使わないスクリプトとはすべてlocalで宣言すると言うことでしょうか?
- hkd9001
- ベストアンサー率48% (99/204)
tetsu222 さん、こんにちは。 さて、スクリプトの詳細を拝見しないと何とも言えないのですが、まず… 「my」などで変数を宣言している部分がお有りかと思うのですが、同じものが2つ書かれていないかチェックしてみては如何でしょうか? ちなみにエラーの意味は「"my"変数<変数名>が、同じスコープ(有効範囲、と考えてください)の中での より早期の宣言とカブッている」みたいな感じですね。
補足
hkd9001さん、こんにちは。 スコープとはその変数の有効範囲ということですよね? エラーで指摘されている変数名は指摘された行があるサブルーチン内では現在使用してません。よって、宣言もしてないのです。確かに以前は使用していたのですが、変更しました。ほかのサブルーチンでは使用しているのですが、そっちまで関係しているのでしょうか?
お礼
hkd900さん、ありがとうございます。 まずは変数名を整理してみようと思います。 さすがにファイルが違えば同じ変数名でも大丈夫ですよね? requireのものまでとなるとちょっとへこみます。 変数が多くなると名前をつけるので考え込んでしまうときがあるので(笑) 余談ですが、myの()「カッコ」ですが値を複数渡すときに使用してます。 &SUB($AA,$BB,$CC,@DD); ↓ subSUB{ my($AA,$BB,$CC,@DD)=@_; ってな感じです。 こんなときは()カッコなしでも良いのかな? たしか参考にした本にこう書いてあったのでまったく違和感なく使ってました(笑)