• ベストアンサー

初心者です。Perlではどんな時変数宣言は必要ですか?

Perl初心者です。 マニュアル本を見ると、Perlでは特に変数を宣言しなくても扱えるようになっていますよね。 今まで幾つか自作CGIプログラムを作ってきたのですが、一度も my や localといった変数宣言を使った事がありません。 プログラム自体は正常に稼働しているので今まで全く無視していたのですが、こちらのPerlカテゴリの質問などを参照させていただいていると、皆さん必ず変数を my で宣言してらっしゃいます。 これは行った方がよいものなのですか? 宣言する事のメリット、宣言しない事のリスク、もしくはしたほうが良い場合、しない方が良い場合等を教えてください。とりあえず、サブルーチン内で宣言すると他のサブルーチンでは使えないらしい、という事だけは朧気に… よろしくお願いします。

  • Perl
  • 回答数3
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • zxcv0000
  • ベストアンサー率56% (111/196)
回答No.2

良い/悪いを一言で答えるなら、私は「my 宣言した方が良い」と思います。 サブルーチン中で使用する変数の名前を決める時に、そのサブルーチン中で my宣言すれば、別のサブルーチンやメインで使用している変数の名前との衝突を意識する必要がありません。 これはとても重要です。 たくさんソースを書く様になるとそんな事は気にしてられないし、「同一変数名禁止」という制約も許容できなくなるでしょう。 逆に、全てのサブルーチンで共用したい変数があった場合には、その .pl ファイルの上の方で 1回だけ my 宣言すればOKです。 これは宣言無で使うグローバル変数と似た効果です。 ステップアップすればこの両者を使い分けますが、 1本の .pl ファイルに全てを書いている内は my宣言必須と思ってOKです。 一方、local宣言は、my宣言が無かった perl4 までで多用されていたもので、my宣言より有利な局面はとても少いと思います。 なぜグローバル変数が嫌われるかについて、勉強したいと思われるなら「名前空間の汚染」でネット検索してみてください。

ruri6syo
質問者

お礼

Perl以外、アプリケーション添付のスカラーのグローバル変数しか存在しない簡易スクリプトしか使った事が無かった為、「名前空間」という言葉を初めて知りました。 教えてくださりありがとうございます。早速検索しました。 概念についてはなんとなく理解出来ました。汚染については私でも分かる形の記述を見つける事が出来ませんでしたので、本などでももっと詳しく調べてみようと思います。 変数名にはこのような分類が出来るようになっていたのですね。 my宣言の意味と必要性が見えてきました。 myとlocalの違いがよく分からず、入門書の記述を読みながら疑問でした。Perl4まではmyが無くlocal宣言だったという経緯のせいだったのですね。 丁寧なご回答ありがとうございました。目の前の世界が広がった気分です。

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

できる限り use strict; して my で変数を定義すべし. そうすれば, 「ちょっとしたスペルミス」は Perl のほうでチェックしてくれるので眼を皿のようにする必要もない.

ruri6syo
質問者

お礼

はい、わかりました! 今まで宣言の意味が分からなかったので、辞典式のマニュアル本でuse strict;の項目は全く開いた事がありませんでした。 Tacosan様の書いて下さったスペルを見てから調べてみて、初めて存在を知りました。ここで教えて下さらなかったら、一生見なかったかもしれません。 馬鹿みたいに初歩的な質問ですが、勇気を出して質問してみてよかったです! 確かにこれは記述中の強い見方になってくれそうです。 実際、変数のスペルミスで苦労してますので。 簡易でないプログラム言語にはこんな便利な機能が揃っているのですね! もっと勉強しなくては。とてもやる気が出ました^^ ありがとうございます!

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.1

 他の言語のように、その変数が実数型であるかとか、そういう宣言は必要ありませんが、myやloclaは、できるだけ使うようにしています。  オブジェクト型なので、サブルーチンに分割して製作することが多いのですが、そうすると他のサブルーチンやメインのプログラムと衝突することがでてきます。特に良くできたサブルーチンを他のプログラムで流用したいときなど・・。  単一の簡単なプログラムでは、my やlocalの宣言は、絶対必要というわけではありませんが、宣言する癖を付けておいたほうが楽になります。この変数は使ったっけ???と悩むより、local宣言ししまえば・・  そんな感じでいます。

ruri6syo
質問者

お礼

ありがとうございます。 perlを始める前に使っていた簡易スクリプト言語が、変数宣言しないタイプでしたので、すっかり宣言しないクセがついてしまっていました。 やはり大きなプログラムを組むとなると、宣言しておいたほうが安全、ということになるのでしょうか。 今は、間違って同じ変数を使わないよう、ノートに変数リストを書き出して管理していますが、大きなプログラム中で、絶対に宣言をしなくてはいけないケースなどはありますか? 今現在、1000行~1500行くらいのプログラムが主で、そんなに大きくない為なのか特に不便を感じていないので、宣言の意図がいまいちピンと来ません。

関連するQ&A

  • Perlのmyのサブルーチンの内外での宣言の違い

    Perlでmyを使う場合、サブルーチンの内外での宣言の違いについて知りたいです。 私はよくある変数をそのプログラム内全体で使う時(カウントするだけの$iみたいなものや、DBのクエリなど)は、同じ変数名をサブルーチン内で毎回宣言するのが嫌(個人的に同じことを重複するプログラムが好きではないという主義)なので、サブルーチンの外でmyを宣言するのですが、myとかはサブルーチン外で宣言するとどんな問題が生じる可能性があるのでしょうか? また毎回サブルーチン内で宣言するのと外部で宣言するのではどういった時に問題になるのでしょうか?もちろんサブルーチンの外でmy宣言した場合はサブルーチンにその変数が引き継がれることは知っています。 リファレンス部分で変わるような記述を見たことはあります。 さしあたって問題を感じでいないのです、ふと疑問に思ったのですが、どうもそれに書かれたソースが少ないので御存知の方がいればぜひ御教授願いたいです。 <例> my $hoge; sub hoge1 { $hoge = 1; } sub hoge2 { $hoge = 5; } と sub hoge1 { my $hoge = 1; } sub hoge2 { my $hoge = 5; }

    • ベストアンサー
    • Perl
  • Perlの変数宣言について

    PHPを毎日書いている者ですが、たまたまPerlのメールフォームをカスタマイズ しなければならなくなりました。 use strict宣言がある場合、変数はmyまたはlocalで宣言しなければいけないようですが、 サブルーチン内に sub form { ・・・ my ($form_value,$error_list) = @_; ・・・ print $error_list{'inquiry_type1'} としたところ、 Global symbol "%error_list" requires explicit package name at ・・・ と、宣言が無い場合に出るというエラーが出ました。 $error_listには、inquiry_type1は入っているはずなのですが、どのような 宣言をすればよいのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Perl
  • use strictを宣言してlocal変数を使うには?

    Perl初心者です。初歩的な質問ですが、 サブルーチンの中で my だと、その下の{ } ブロックではmyで宣言したローカル変数がスコープされないので  localを使うのではないかと思いますが、 それだと、use strictではエラーになります。 こんなときどう処理したらよいのでしょうか。

    • ベストアンサー
    • Perl
  • 【Perl】サブルーチンから多次元配列を戻したい

    【Perl】サブルーチンから多次元配列を戻したい サブルーチン内で作った2次元配列と1つの変数(例:@listと$i)をリターンしたいのですが、どのようにすれば良いでしょうか? ↓サブルーチン(calc) return (@list, $i); ↓メイン my $a = 12; my (@list, $i) = &calc($a); 間違っていると思いますが、現時点でのプログラムを一部書きました。 ご回答よろしくお願いします!

    • ベストアンサー
    • Perl
  • BEGIN{}での変数宣言

    'perl'では変数の有効範囲について、'c' と考えかたが違うようですが、違和感があります。 1000行を超えるような'perl'で、随処で頻繁に使うような重要なグローバル変数では、BEGIN 内で明示的に宣言したほうが、引き継いだひとにも親切にかんじるのですが、みなさんはどうお感じになりますか? 'perl'を作られたかたは、'c'の自動変数を'my'で、'extern'を宣言不要という思想でつくられたのでしょうか? (2回目の質問です。変な質問でしたら、ごめんなさい<ToT>)

    • ベストアンサー
    • Perl
  • PERL 宣言文 -wについて

    Perl初心者のWEBサーバエンジニアです。 サーバの移行に伴ってCGIファイルが動作していないため、ご相談になります。 【サーバ環境】 perl実行パス      /usr/local/bin/perl シンボリックリンク   /usr/bin/perl => /usr/local/bin/perl ソース記述       #!/usr/bin/perl ヴァージョン      5.8.5 perl実行環境      http://△△△.jp/cgi-bin/ ※apacheのスクリプトエイリアス指定 options +ExecCGI -Include SetHandler cgi-script 上記の環境で、cgiファイルが500internalサーバエラーになる現象が発生しています。 ファイルは以前動作したサーバから引っ張ってきました。 原因を探っていたのですが、cgiファイルのソース記述を #!/usr/bin/perl -w と記述を変更すると正常に動作しました。 -w について 【1度しか出現しない識別子や、初期化されずに参照される変数など、危険、無駄と思われる処理の警告を出力します。実際にはもっとたくさんの種類のチェックをするようです。】 と言う事はわかりましたが、いままで、-wなしで動作していたので、-wなしで動くよう、perlの設定を変更したいとかんがえております。 なにぶんPERL初心者ですので、同様の事象で知見がある方、ご教授を宜しくお願いいたします。

    • ベストアンサー
    • CGI
  • Perl/JavaScript/サブルーチン

    はじめまして。 今ちょっといじってるプログラムについてお聞きしたいことがあります。 index.htmlのtextareaからmy.cgiを呼び出したい のですが。my.cgiというのは 1.textareaに入力された文章をデータベースに保存。 2.日付順にソートし新しいものを一つだけ取り出す。 3.index.htmlに表示する というものなのですが。 デフォルトでtextareaに一番新しい情報が入るようにしたいのです。valueで指示したのですがJavaScriptが邪魔してブラウザに反映されません。ソースを見るとvalue="********"とはいっています。 my.cgiを呼び出す命令を記述したmy.jsというファイルを作ってサブルーチンのように扱うという方法も考えているのですが、呼び出しやindex.htmlに表示させる記述の仕方が分かりません。 どなたか分かる方は、どうぞ宜しくお願いいたします。

  • PerlからPHPへ移行したときの注意事項は

    PerlからPHPに移りまして、戸惑うことがあります。 Perlでは、 use strict; my $hensuu = 1; とレキシカル変数としなければ、変数未宣言となり スペル間違いの変数の使用が避けられるのですが、 PHPでは、 $hensuu = 1; と、何の設定もなく、利用時に $hensu += 0; としても問題なく動作します。 これって危険なのですが、みなさんはどう対処していますか? あと、PerlからPHPにソース移行する場合に 気をつけないことがありましたら、教えてください。

    • ベストアンサー
    • PHP
  • perlの構文間違いについて

    以下のような、perlの構文で$infoをmyスコープで宣言しつつ、$datという変数が真なら$infoに$datが入ることを期待しているのですが、まちがっているのでしょうか? my $info = $dat if ($dat); よろしくお願いします。

    • ベストアンサー
    • Perl
  • サブルーチンを認識しません。

    perlプログラムで サブルーチンの中で、別のサブルーチンを呼び出していますが、 なぜか認識しません。 KCatchでは以下の表示をしています。 Catch: Mon Sep 22 07:56:36 2003 ------------------------------------------------- [regist.cgi:375:die] Undefined subroutine &main::lock called. > &lock; ------------------------------------------------- regist.cgi with Perl 5.00502 for freebsd サブルーチン名には頭に & を付けて呼び出しています。 サブルーチンは、スクリプトの最後にまとめてあります。 同じサブルーチンは、他のスクリプトでも利用していますが、 エラーは出ていないのですが。 何が原因か、わかりません。 関係ないかもしれませんが、プログラム最初の方でuse strict;の宣言をしています。 他のサブルーチンも認識しません。 KCacthの表示は同じ &main::サブルーチン名 called になっています。 よろしくお願いします。

    • ベストアンサー
    • Perl