• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:「-wc」オプションの文法チェックで、警告が出ないようにするには?)

「-wc」オプションの文法チェックで警告が出ないようにする方法とは?

このQ&Aのポイント
  • 「-wc」オプションを使った文法チェックで、変数の警告を回避する方法について教えてください。
  • Perlスクリプトとライブラリの文法チェック時に出る警告を抑制する方法について知りたいです。
  • 変数の設定・参照に関する警告を回避するための記述方法について教えてください。

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

  • ベストアンサー
  • N60-BASIC
  • ベストアンサー率80% (17/21)
回答No.3

No.2で回答した者です。 > ライブラリのほうは、ourで宣言したことで警告はでなくなりました。 > スクリプトファイルのほうは、すべてをour宣言するのは大変なので「このままでもいいかな~」と思ってます。 > それとも、たとえ大変でもour宣言するのが普通でしょうか?皆さんはどのようになさってますか? 以下はあくまで私の考え方&実装方針なので、参考までに留めていただければ。 ●ハッシュを使えば多少スッキリ たくさん宣言するのが嫌なら、変数自体を減らしてしまえ、という発想です。 仮に$paramA, $paramB, $paramCとグローバル変数が3つあったとしたら、 our %INI = ( paramA => 'foo', paramB => 'bar', paramC => 'hoge', ); としてやればグローバル変数は1つになります。(何でもかんでもまとめればいいわけではないので、ほどほどに) 例えば環境依存の設定に関連する項目をまとめて外部ファイルに置いたりするのに有用です。もっとも、第三者が設定変更するようなファイルの場合は、Perlの文法に依存しない外部ファイルにして、設定読み込み用モジュール経由で取り込む場合もあります。 注意点として、ハッシュキーのスペルミスは文法エラーにならないばかりか、実行時であっても未定義値の読み書きが即エラーになるわけではないので、デバッグが手間取る場合があります。その場合、-wやuse warningsを併用すれば、未定義値に関する警告が出るので若干見つけやすくなります。 ●クラスオブジェクトを作る Perlの場合は、ある意味では上記ハッシュの発展形とも言えます。 特定の処理をコントロールするために複数のグローバル変数を使用している場合は、クラスオブジェクト化してプロパティやメソッドにまとめることで非常にスマートになる場合があります。逆に初期設計を間違えると、本人すら理解できない複雑怪奇なプログラムになることもありますが・・。 ●package化してuse Exporterで変数をエクスポートする おそらく質問者さんのやりたいことに一番近いかと思います。 Exporterモジュールを利用したパッケージをuseすると、パッケージ内で指定されたグローバル変数を暗黙的(または明示的)に取り込む(import)ことができます。使い方の詳細はご自分で調べてみてください。 でも、個人的には「暗黙の変数インポート=名前空間の汚染」と考えてますので、Exporterを使う場合でもなるべく明示的なエクスポートのみを利用して、読み込み側でも宣言するようにしています。 ●グローバル変数がやたらと多いプログラムはそもそも設計でミスしていることが多い グローバル変数が多いなと思ったら、全体設計を一度見直してみるべきです。たいていの場合は改善可能なことが多いです。 例えば、 ・関数の引数や戻り値で、ローカル変数の引渡しで済むところを手抜きしてグローバル変数にしてしまう。結果として、引数や戻り値から関数の処理が推測できなくなり、見通しが悪くなる場合が多い。 ・本来パッケージやクラスオブジェクトにまとめるべき処理を、requireで全部main::の中に入れてしまい、収拾がつかなくなる。 など。 特に、どこで値が変更されているかわからないグローバル変数というのは、デバッグで最も厄介な部類のものです。書いている時は頭でわかってても、半年もすれば自分のプログラムが読めなくなっていることがあります。 大規模なプログラムになればなるほど、グローバル変数が多いプログラムというのは可読性もメンテナンス性も下がっていき、バグを誘発しやすくなります。 以上、思いつきでずらずらと書いてみました。 自由なスタイルで記述できることはPerlの大きな利点ですし、グローバル変数も含め、状況によって使い分けられれば理想的かなと思います。

hotjupiter
質問者

お礼

ありがとうございました。 グローバル変数の数、70個以上もあります。 同じ種類の変数同士をハッシュにすれば10数個に減るので、本来ならそうすべきなんでしょうね。 しかしハッシュって、ゴチャゴチャするのがどうも…。 「$Form{'text'}」とやるより、「$FormText」のほうがすっきりするので好きなんですよね。

その他の回答 (2)

  • N60-BASIC
  • ベストアンサー率80% (17/21)
回答No.2

●動作環境がPerl 5.8以降であれば、ourによる変数宣言が使えます。(myだとスコープがファイル内になってしまうため、require対象の外部ファイルにおける変数値の変更が反映されません) #! c:/perl/bin/perl our $A; require "temp.pl"; print $A; ●Perl 5.6など、古いバージョンとの互換性を重視するならuse varsを使うことになります。 #! c:/perl/bin/perl use vars qw($A); require "temp.pl"; print $A; でもPerl 5.8がリリースされてからもう8年近く経ちますから、新しいバージョンへの移行を検討すべきでしょう。 ●全く推奨しませんが、-wを無効にしてしまうという反則技もあります。 #! c:/perl/bin/perl no warnings; require "temp.pl"; print $A; ご参考まで。

hotjupiter
質問者

補足

ありがとうございます。 バージョンについてはあまり気にしてませんでした。 詳しくお教えいただきありがとうございました。 No1.さんへも補足で質問させていただいたのですが、よろしかったらお答えいただければ幸いです。

  • t-okura
  • ベストアンサー率75% (253/335)
回答No.1

temp.cgi と temp.pl の両方で our $A として、 $A がグローバル変数であると宣言すればよいです。

hotjupiter
質問者

補足

ありがとうございました。ourでグローバル変数の定義ができるのですね。 手持ちの本にも載ってなかったので知りませんでした。 追加で質問させていただきたいことがあります。 ライブラリのほうは、ourで宣言したことで警告はでなくなりました。 スクリプトファイルのほうは、すべてをour宣言するのは大変なので「このままでもいいかな~」と思ってます。 それとも、たとえ大変でもour宣言するのが普通でしょうか?皆さんはどのようになさってますか?

関連するQ&A