- ベストアンサー
初心者です。Perlではどんな時変数宣言は必要ですか?
Perl初心者です。 マニュアル本を見ると、Perlでは特に変数を宣言しなくても扱えるようになっていますよね。 今まで幾つか自作CGIプログラムを作ってきたのですが、一度も my や localといった変数宣言を使った事がありません。 プログラム自体は正常に稼働しているので今まで全く無視していたのですが、こちらのPerlカテゴリの質問などを参照させていただいていると、皆さん必ず変数を my で宣言してらっしゃいます。 これは行った方がよいものなのですか? 宣言する事のメリット、宣言しない事のリスク、もしくはしたほうが良い場合、しない方が良い場合等を教えてください。とりあえず、サブルーチン内で宣言すると他のサブルーチンでは使えないらしい、という事だけは朧気に… よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
良い/悪いを一言で答えるなら、私は「my 宣言した方が良い」と思います。 サブルーチン中で使用する変数の名前を決める時に、そのサブルーチン中で my宣言すれば、別のサブルーチンやメインで使用している変数の名前との衝突を意識する必要がありません。 これはとても重要です。 たくさんソースを書く様になるとそんな事は気にしてられないし、「同一変数名禁止」という制約も許容できなくなるでしょう。 逆に、全てのサブルーチンで共用したい変数があった場合には、その .pl ファイルの上の方で 1回だけ my 宣言すればOKです。 これは宣言無で使うグローバル変数と似た効果です。 ステップアップすればこの両者を使い分けますが、 1本の .pl ファイルに全てを書いている内は my宣言必須と思ってOKです。 一方、local宣言は、my宣言が無かった perl4 までで多用されていたもので、my宣言より有利な局面はとても少いと思います。 なぜグローバル変数が嫌われるかについて、勉強したいと思われるなら「名前空間の汚染」でネット検索してみてください。
その他の回答 (2)
- Tacosan
- ベストアンサー率23% (3656/15482)
できる限り use strict; して my で変数を定義すべし. そうすれば, 「ちょっとしたスペルミス」は Perl のほうでチェックしてくれるので眼を皿のようにする必要もない.
お礼
はい、わかりました! 今まで宣言の意味が分からなかったので、辞典式のマニュアル本でuse strict;の項目は全く開いた事がありませんでした。 Tacosan様の書いて下さったスペルを見てから調べてみて、初めて存在を知りました。ここで教えて下さらなかったら、一生見なかったかもしれません。 馬鹿みたいに初歩的な質問ですが、勇気を出して質問してみてよかったです! 確かにこれは記述中の強い見方になってくれそうです。 実際、変数のスペルミスで苦労してますので。 簡易でないプログラム言語にはこんな便利な機能が揃っているのですね! もっと勉強しなくては。とてもやる気が出ました^^ ありがとうございます!
- ORUKA1951
- ベストアンサー率45% (5062/11036)
他の言語のように、その変数が実数型であるかとか、そういう宣言は必要ありませんが、myやloclaは、できるだけ使うようにしています。 オブジェクト型なので、サブルーチンに分割して製作することが多いのですが、そうすると他のサブルーチンやメインのプログラムと衝突することがでてきます。特に良くできたサブルーチンを他のプログラムで流用したいときなど・・。 単一の簡単なプログラムでは、my やlocalの宣言は、絶対必要というわけではありませんが、宣言する癖を付けておいたほうが楽になります。この変数は使ったっけ???と悩むより、local宣言ししまえば・・ そんな感じでいます。
お礼
ありがとうございます。 perlを始める前に使っていた簡易スクリプト言語が、変数宣言しないタイプでしたので、すっかり宣言しないクセがついてしまっていました。 やはり大きなプログラムを組むとなると、宣言しておいたほうが安全、ということになるのでしょうか。 今は、間違って同じ変数を使わないよう、ノートに変数リストを書き出して管理していますが、大きなプログラム中で、絶対に宣言をしなくてはいけないケースなどはありますか? 今現在、1000行~1500行くらいのプログラムが主で、そんなに大きくない為なのか特に不便を感じていないので、宣言の意図がいまいちピンと来ません。
お礼
Perl以外、アプリケーション添付のスカラーのグローバル変数しか存在しない簡易スクリプトしか使った事が無かった為、「名前空間」という言葉を初めて知りました。 教えてくださりありがとうございます。早速検索しました。 概念についてはなんとなく理解出来ました。汚染については私でも分かる形の記述を見つける事が出来ませんでしたので、本などでももっと詳しく調べてみようと思います。 変数名にはこのような分類が出来るようになっていたのですね。 my宣言の意味と必要性が見えてきました。 myとlocalの違いがよく分からず、入門書の記述を読みながら疑問でした。Perl4まではmyが無くlocal宣言だったという経緯のせいだったのですね。 丁寧なご回答ありがとうございました。目の前の世界が広がった気分です。