Perl初心者です。
マニュアル本を見ると、Perlでは特に変数を宣言しなくても扱えるようになっていますよね。
今まで幾つか自作CGIプログラムを作ってきたのですが、一度も my や localといった変数宣言を使った事がありません。
プログラム自体は正常に稼働しているので今まで全く無視していたのですが、こちらのPerlカテゴリの質問などを参照させていただいていると、皆さん必ず変数を my で宣言してらっしゃいます。
これは行った方がよいものなのですか?
宣言する事のメリット、宣言しない事のリスク、もしくはしたほうが良い場合、しない方が良い場合等を教えてください。とりあえず、サブルーチン内で宣言すると他のサブルーチンでは使えないらしい、という事だけは朧気に…
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
良い/悪いを一言で答えるなら、私は「my 宣言した方が良い」と思います。
サブルーチン中で使用する変数の名前を決める時に、そのサブルーチン中で my宣言すれば、別のサブルーチンやメインで使用している変数の名前との衝突を意識する必要がありません。 これはとても重要です。 たくさんソースを書く様になるとそんな事は気にしてられないし、「同一変数名禁止」という制約も許容できなくなるでしょう。
逆に、全てのサブルーチンで共用したい変数があった場合には、その .pl ファイルの上の方で 1回だけ my 宣言すればOKです。 これは宣言無で使うグローバル変数と似た効果です。 ステップアップすればこの両者を使い分けますが、 1本の .pl ファイルに全てを書いている内は my宣言必須と思ってOKです。
一方、local宣言は、my宣言が無かった perl4 までで多用されていたもので、my宣言より有利な局面はとても少いと思います。
なぜグローバル変数が嫌われるかについて、勉強したいと思われるなら「名前空間の汚染」でネット検索してみてください。
Perl以外、アプリケーション添付のスカラーのグローバル変数しか存在しない簡易スクリプトしか使った事が無かった為、「名前空間」という言葉を初めて知りました。
教えてくださりありがとうございます。早速検索しました。
概念についてはなんとなく理解出来ました。汚染については私でも分かる形の記述を見つける事が出来ませんでしたので、本などでももっと詳しく調べてみようと思います。
変数名にはこのような分類が出来るようになっていたのですね。
my宣言の意味と必要性が見えてきました。
myとlocalの違いがよく分からず、入門書の記述を読みながら疑問でした。Perl4まではmyが無くlocal宣言だったという経緯のせいだったのですね。
丁寧なご回答ありがとうございました。目の前の世界が広がった気分です。
No.3
- 回答日時:
できる限り use strict; して my で変数を定義すべし.
そうすれば, 「ちょっとしたスペルミス」は Perl のほうでチェックしてくれるので眼を皿のようにする必要もない.
はい、わかりました!
今まで宣言の意味が分からなかったので、辞典式のマニュアル本でuse strict;の項目は全く開いた事がありませんでした。
Tacosan様の書いて下さったスペルを見てから調べてみて、初めて存在を知りました。ここで教えて下さらなかったら、一生見なかったかもしれません。
馬鹿みたいに初歩的な質問ですが、勇気を出して質問してみてよかったです!
確かにこれは記述中の強い見方になってくれそうです。
実際、変数のスペルミスで苦労してますので。
簡易でないプログラム言語にはこんな便利な機能が揃っているのですね!
もっと勉強しなくては。とてもやる気が出ました^^
ありがとうございます!
No.1
- 回答日時:
他の言語のように、その変数が実数型であるかとか、そういう宣言は必要ありませんが、myやloclaは、できるだけ使うようにしています。
オブジェクト型なので、サブルーチンに分割して製作することが多いのですが、そうすると他のサブルーチンやメインのプログラムと衝突することがでてきます。特に良くできたサブルーチンを他のプログラムで流用したいときなど・・。
単一の簡単なプログラムでは、my やlocalの宣言は、絶対必要というわけではありませんが、宣言する癖を付けておいたほうが楽になります。この変数は使ったっけ???と悩むより、local宣言ししまえば・・
そんな感じでいます。
ありがとうございます。
perlを始める前に使っていた簡易スクリプト言語が、変数宣言しないタイプでしたので、すっかり宣言しないクセがついてしまっていました。
やはり大きなプログラムを組むとなると、宣言しておいたほうが安全、ということになるのでしょうか。
今は、間違って同じ変数を使わないよう、ノートに変数リストを書き出して管理していますが、大きなプログラム中で、絶対に宣言をしなくてはいけないケースなどはありますか?
今現在、1000行~1500行くらいのプログラムが主で、そんなに大きくない為なのか特に不便を感じていないので、宣言の意図がいまいちピンと来ません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 変数の初期化について 5 2022/10/02 08:55
- Excel(エクセル) Excel マクロで For 文のインデックスを先に宣言する理由 7 2022/08/27 00:26
- C言語・C++・C# 競技プログラミングに関する質問です。 3 2022/04/03 19:51
- Perl perlでリテラル値はメモリにどのように格納されているか? 1 2023/01/15 20:45
- Perl perlで2次元配列をサブルーチンに値渡しで渡す 5 2022/12/17 18:49
- その他(プログラミング・Web制作) 変数宣言および代入について 4 2022/11/02 13:03
- 政治 気象庁の「梅雨明け宣言」は不要。 14 2023/07/11 13:15
- その他(プログラミング・Web制作) Pythonのライブラリ、randomについて 3 2022/09/20 14:30
- JavaScript 変数宣言と初期値代入の場所について 3 2022/10/31 19:09
- C言語・C++・C# c言語 コマンドライン引数 4 2023/02/09 18:47
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
例外処理のフローチャートの記...
-
Excel VBAで、ユーザーフォー...
-
GOSUB命令とは
-
初心者です。Perlではどんな時...
-
VBAで2重のDoLoop関数から抜け...
-
COBOLで、Shellを起動するには?
-
Attempt to free unreferenced ...
-
サブルーチンを認識しません。
-
Excel VBAでリンク切れをチェッ...
-
perlをバージョンアップしたら...
-
VBAで別モジュールへの変数の受...
-
Excelで時刻になったら知らせて...
-
Excel VBA 『Call』で呼び出す...
-
標準モジュールを削除したい。(...
-
VBSがコンパイルエラーになりま...
-
VBAで旧字体を異字体に一括で変...
-
erf(x)とerfc(x)のカタカナ読み...
-
エクセルVBA クラスモジュール...
-
VBでグローバル変数を宣言するには
-
LCD ディスプレイを Raspberry ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
例外処理のフローチャートの記...
-
Excel VBAで、ユーザーフォー...
-
モジュールとサブルーチン
-
オフコン(富士通Kシリーズ)...
-
COBOLで、Shellを起動するには?
-
配列と互換性のない型の要素に...
-
サブルーチンを認識しません。
-
初心者です。Perlではどんな時...
-
ExcelVBA AddinでOnAction
-
”:”がいっぱいの文について。
-
fortran95実行エラー
-
ACCESSのVBAでPrivate Sub ~en...
-
Excel2000VBA 複数のテキストボ...
-
perlの構文でカンマの意味が分...
-
プログラムの「生産性」について
-
初歩的な質問なのですが、サブ...
-
Attempt to free unreferenced ...
-
cobol サブルーチンのlink
-
GOSUB命令とは
-
Excel VBAから利用できるフリー...
おすすめ情報