電子書籍の厳選無料作品が豊富!

ただいま掲示板を製作中なのですが、
コマンドプロンプトでチェックしたところ
"my" variable 変数 masks earlier declaration in same scope at ××××.cgi line….
とのエラーが出ます。

おかしなことにサブルーチン内で重複していたため変数名を変えたはずの以前の変数名でエラー表示になっています。
また現在使用中の変数名でのエラーも出るのですが、以前の変数、使用中の変数のエラーとも指摘されたlineの行では使用してません。

エラーの意味は「同じ名前の変数がありますよ。」ってことなのでしょうか?確かに同じ名前を使ってしまっていたのですが現在は修正したので問題ないはずです。
現在はネットで頂いてきた「Perl CGI Script 実行チェックプログラム」ではエラーなくブラウザに表示されるのですが、直接CGIを実行してもブラウザには表示されません。
なにを修正すればいいのかまったく検討がつきません。
どなたかご教授願いませんでしょうか?

A 回答 (3件)

tetsu222 さん、おはようございます。


(スクリプトのサンプルもありがとうございました)

さて私の申し上げた「myを使わなくてすむスクリプト」ですが、これは「グローバル変数だけを使ったスクリプト」という意味なのでした。このことによりスコープを気にする必要がなくなるので、その分ロジックのほうに集中できる、というメリットがありますね~(私の経験から)。掲示板を作られているということですが、これってロジックがある程度込み入ってますよね~。

あと、書いてくださったコードについては、特に問題は無さそうですが…「my」の後にカッコ「(…)」がついているのは初めて見ました。これってエラーにならないんですね…。あ、余談でした(笑)。

…ご参考になれば幸いです。もし追加でご質問あれば、どうぞ。
    • good
    • 0
この回答へのお礼

hkd900さん、ありがとうございます。
まずは変数名を整理してみようと思います。
さすがにファイルが違えば同じ変数名でも大丈夫ですよね?
requireのものまでとなるとちょっとへこみます。
変数が多くなると名前をつけるので考え込んでしまうときがあるので(笑)

余談ですが、myの()「カッコ」ですが値を複数渡すときに使用してます。
&SUB($AA,$BB,$CC,@DD);

subSUB{
my($AA,$BB,$CC,@DD)=@_;
ってな感じです。
こんなときは()カッコなしでも良いのかな?
たしか参考にした本にこう書いてあったのでまったく違和感なく使ってました(笑)

お礼日時:2007/01/19 13:16

tetsu222 さん、レスありがとうございます。



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

…これで うまく解決できるといいのですが…

この回答への補足

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

ちなみにmyを使わないスクリプトとはすべてlocalで宣言すると言うことでしょうか?

補足日時:2007/01/18 22:21
    • good
    • 0
この回答へのお礼

付けたしです。
&SUB($AA);

sub SUB{
my($AA)=@_;
}
としてます。

お礼日時:2007/01/18 22:48

tetsu222 さん、こんにちは。



さて、スクリプトの詳細を拝見しないと何とも言えないのですが、まず…

「my」などで変数を宣言している部分がお有りかと思うのですが、同じものが2つ書かれていないかチェックしてみては如何でしょうか?

ちなみにエラーの意味は「"my"変数<変数名>が、同じスコープ(有効範囲、と考えてください)の中での より早期の宣言とカブッている」みたいな感じですね。

この回答への補足

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

補足日時:2007/01/18 11:43
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!