• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:CGI.pmについて)

CGI.pmの使い方について

このQ&Aのポイント
  • perlのCGI.pmモジュールの使い方について教えていただきたいです。
  • $MyForm::nameといった形での取得方法について知りたいです。
  • MyFormを無定義にする方法について教えてください。

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

  • ベストアンサー
  • root139
  • ベストアンサー率60% (488/809)
回答No.3

> ただ、もしmod_perlを使用する場合、前回の値が保持されないようにする場合は、 > やはり一度@namesをundefしてから使用するようにした方がいいですか? 配列やハッシュでもそれ自身に代入を行うと、以前の内容は上書きされて残りません。 例) -------------------------------------------------------------- @name = ('a', 'b', 'c'); print join(',', @name); # a,b,c が表示される print "\n------------------\n"; @name = (1, 2, 3); print join(',', @name); # 1,2,3 が表示される ------------------------------------------------------------------ ですので、「@names = $test->param;」とした時点で、以前の内容が@nameに残っている可能性はありません。 それから、グローバル変数はどこで変更・参照されるか把握するのが難しいのでなるべく使わないようにし、ローカル変数を多く使うようにするのが良いと思います。他のルーチンとのデータのやり取りは、基本的に引数と戻り値を使うようにします。 変数にmyを付けて宣言すると、その変数の有効範囲を宣言のあるブロック({}で囲まれた範囲)の内部に制限することが出来ます。(ローカル変数) http://www.rfs.jp/sb/perl/02/01.html#2%EF%BC%8E%E5%A4%89%E6%95%B0%E3%81%AE%E6%9C%89%E5%8A%B9%E7%AF%84%E5%9B%B2 ただし、ブロックで囲まれていない部分ではmyをつけてもグローバル変数とあまり変わらなくなってしまいますので、ご注意を。 サブルーチンを含まないブロック(ブロック自身はサブルーチンでも良い)の中で宣言されたローカル変数であれば、他の場所で変更されたり前回の結果を参照してしまう心配は有りません。 ちなみに「use strict;」を付けるとmyやourなどの宣言無しで変数を使うとエラーになり、変数名のタイプミスやスコープの勘違いの発見が容易になります。 ごく簡単なプログラム以外では「use strict;」を使う方が良いです。

yuna76
質問者

お礼

丁寧に説明していただきありがとうございました。 なんか、perlの基礎的な事まで教えていただいて・・・。 感謝いたします。 >「@names = $test->param;」とした時点で、以前の内容が@nameに残っている可能性はありません。 今後は、paramを使うように変更し、出来るだけローカル変数を使用するようにやってみたいと思います。 今回はとても丁寧な説明をいただきありがとうございました。 ほんと助かりました。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • root139
  • ベストアンサー率60% (488/809)
回答No.2

> CGI.pmは$test = new CGI;とした時点で変数($MyForm::name)は空になっているのでしょうか? 基本的には、どこかの処理でパッケージMyFormのグローバル変数を設定していなければ、変数 $MyForm::~~ は空のはずです。 例) -------------------------------------------------------------- print $MyForm::name; # 何も表示されない。(未初期化値のへアクセスの警告が出る) package MyForm; our $name = 'hoge'; package main; print $MyForm::name; # 「hoge」が表示される ------------------------------------------------------------------ ただし、mod_perlなどの環境においては、前回の実行時の値が保持されてしまうことが有ります。 もし、パラメータをパッケージにインポートする必要が無いのであれば、param()メソッドなどを使ってパラメータを取得されるのがよろしいかと。おそらく、この方法のほうが一般的だと思います。 例) -------------------------------------------------------------- use CGI; $test = new CGI; $hoge = $test->param('hoge'); # hogeパラメータの値の取得 @names = $test->param; # 全パラメータ名の取得 ------------------------------------------------------------------

参考URL:
http://homepage3.nifty.com/hippo2000/perltips/Cgi.htm#FETCHING_THE_VALUE_OR_VALUES_OF_
yuna76
質問者

お礼

とても丁寧に説明していただきありがとうございます。 私の場合、mod_perlを出来るだけ利用する予定ですので、その場合もしかしたら前回の実行時の値が保持される場合があるようですね。 また、パッケージにインポートするような使い方はしない予定ですので、param()を使うようにしたいと思います。 ただ、もしmod_perlを使用する場合、前回の値が保持されないようにする場合は、やはり一度@namesをundefしてから使用するようにした方がいいですか? 何度も申し訳ありませんが、よろしくお願いいたします。

すると、全ての回答が全文表示されます。
  • root139
  • ベストアンサー率60% (488/809)
回答No.1

MyFormパッケージ中の全てのグローバル変数を初期値(undef, 空配列, 空ハッシュ)にすれば良いのであれば、下記の様に書けます。ぎこちないコードですが。 -------------------------------------------------------------------- foreach my $key (keys %MyForm::) { undef($MyForm::{$key}); } --------------------------------------------------------------------

yuna76
質問者

お礼

早速ありがとうございます。 やはりそれぞれの変数をundefするしかないのですね・・・。 今までCGI.pmを使った事がなく、他のサイトで使われていたデコードにて使用しておりましたが、どうしても変数が残ってしまい、毎回変数を一度undef等を行ってから使用しておりました。 CGI.pmは$test = new CGI;とした時点で変数($MyForm::name)は空になっているのでしょうか? もしそうでしたらundef等する必要がないかと思ってるのですが・・・。

すると、全ての回答が全文表示されます。

関連するQ&A