![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67b6d)
ただいま掲示板を製作中なのですが、
コマンドプロンプトでチェックしたところ
"my" variable 変数 masks earlier declaration in same scope at ××××.cgi line….
とのエラーが出ます。
おかしなことにサブルーチン内で重複していたため変数名を変えたはずの以前の変数名でエラー表示になっています。
また現在使用中の変数名でのエラーも出るのですが、以前の変数、使用中の変数のエラーとも指摘されたlineの行では使用してません。
エラーの意味は「同じ名前の変数がありますよ。」ってことなのでしょうか?確かに同じ名前を使ってしまっていたのですが現在は修正したので問題ないはずです。
現在はネットで頂いてきた「Perl CGI Script 実行チェックプログラム」ではエラーなくブラウザに表示されるのですが、直接CGIを実行してもブラウザには表示されません。
なにを修正すればいいのかまったく検討がつきません。
どなたかご教授願いませんでしょうか?
No.3ベストアンサー
- 回答日時:
tetsu222 さん、おはようございます。
(スクリプトのサンプルもありがとうございました)
さて私の申し上げた「myを使わなくてすむスクリプト」ですが、これは「グローバル変数だけを使ったスクリプト」という意味なのでした。このことによりスコープを気にする必要がなくなるので、その分ロジックのほうに集中できる、というメリットがありますね~(私の経験から)。掲示板を作られているということですが、これってロジックがある程度込み入ってますよね~。
あと、書いてくださったコードについては、特に問題は無さそうですが…「my」の後にカッコ「(…)」がついているのは初めて見ました。これってエラーにならないんですね…。あ、余談でした(笑)。
…ご参考になれば幸いです。もし追加でご質問あれば、どうぞ。
hkd900さん、ありがとうございます。
まずは変数名を整理してみようと思います。
さすがにファイルが違えば同じ変数名でも大丈夫ですよね?
requireのものまでとなるとちょっとへこみます。
変数が多くなると名前をつけるので考え込んでしまうときがあるので(笑)
余談ですが、myの()「カッコ」ですが値を複数渡すときに使用してます。
&SUB($AA,$BB,$CC,@DD);
↓
subSUB{
my($AA,$BB,$CC,@DD)=@_;
ってな感じです。
こんなときは()カッコなしでも良いのかな?
たしか参考にした本にこう書いてあったのでまったく違和感なく使ってました(笑)
No.2
- 回答日時:
tetsu222 さん、レスありがとうございます。
では次に、このスクリプト全体でみた場合(今度は、スコープは考えない)、「my」で宣言されている変数にダブリがあるかどうか見てみてください。
もしあれば、それが原因と考えられるので、ダブらないような手立てをしてみてください。
反対に、ダブリがないのであれば、そもそも「my」を使わなくてすむようにスクリプトを修正してしまうのが早いかも。
…これで うまく解決できるといいのですが…
この回答への補足
ご丁寧にありがとうございます。
サブルーチンに値を渡すときは渡す側と受け取り側を同じ変数名にしているのですが、もしかしてそれがいけないのでしょうか?
myで宣言しているのでサブルーチンが違えばいいのかと思ってました!もともとlocalはぜんぜん使ってませんが・・・。
それを直すとするとかなりダブりがあるのでちょっと時間がかかるかもしれません。がんばってやってみます。
ちなみにmyを使わないスクリプトとはすべてlocalで宣言すると言うことでしょうか?
No.1
- 回答日時:
tetsu222 さん、こんにちは。
さて、スクリプトの詳細を拝見しないと何とも言えないのですが、まず…
「my」などで変数を宣言している部分がお有りかと思うのですが、同じものが2つ書かれていないかチェックしてみては如何でしょうか?
ちなみにエラーの意味は「"my"変数<変数名>が、同じスコープ(有効範囲、と考えてください)の中での より早期の宣言とカブッている」みたいな感じですね。
この回答への補足
hkd9001さん、こんにちは。
スコープとはその変数の有効範囲ということですよね?
エラーで指摘されている変数名は指摘された行があるサブルーチン内では現在使用してません。よって、宣言もしてないのです。確かに以前は使用していたのですが、変更しました。ほかのサブルーチンでは使用しているのですが、そっちまで関係しているのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エラー
-
メールフォームからの受信メー...
-
EUCのデータファイルをShift_ji...
-
メールフォームから大きめの添...
-
Excel VBAでリンク切れをチェッ...
-
例外処理のフローチャートの記...
-
ユーザー定義関数に#NAME?が返...
-
VBSがコンパイルエラーになりま...
-
Access VBA標準モジュールにつ...
-
エクセルVBAでシートモジュール...
-
Excel VBAで、ユーザーフォー...
-
標準モジュールを削除したい。(...
-
'Range'メソッドは失敗しました
-
Excel VBA 『Call』で呼び出す...
-
LCD ディスプレイを Raspberry ...
-
モジュールの最大数はいくつな...
-
Tomcat マイナーバージョン移行...
-
エクセルVBAで標準モジュー...
-
VBSを利用して、IEのタブを自動...
-
SendKeysの使い方について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エラー
-
perlスクリプト s/^\\s+//; ...
-
何時間後を求める。
-
Perlでのルート計算で、小数点...
-
実行時パラメータを使用するとE...
-
「CGIプログラムエラー」って何...
-
perlでactive directoryに登録
-
perl+shiftjisで5c文字化けの対...
-
ローカルテストOKのPerl サー...
-
Pod::Usageで日本語を使用する...
-
メールフォームからの受信メー...
-
EUCのデータファイルをShift_ji...
-
use encoding 'shiftjis'; の不...
-
メールフォームから大きめの添...
-
Perlで長音
-
Encodeについて
-
例外処理のフローチャートの記...
-
Excel VBAでリンク切れをチェッ...
-
LCD ディスプレイを Raspberry ...
-
「デバイスは PRN を初期化でき...
おすすめ情報