Perl、オブジェクト指向での初期設定ファイルについて。
最近、Perlでのオブジェクト指向を勉強中です。
今までのプログラムをオブジェクト指向に書き直そうと思っています。
クラスを作成して呼び出す程度までは理解できたのですが、
今まで、サーバの絶対パスや、データベースの名称などを、
config.pl というファイルを作って、グローバル変数で宣言していました。
例 $local_parh = "/virtual/xxx/bbb/public_html";
$dbname = "testdb";
$dbuser = "username";
でも、オブジェクト指向では、グローバル変数を使わないようにするということで、
このあたりをふつうはどんなふうに作成するのかとおもったのですが、
なかなか検索しても見つかりません。(検索の仕方が悪いのかもしれませんが)
今思いつく方法は、config.pm などを作って
--------------------------------------------------
package Config;
sub new{
my $class = shift;
my $self= {
local_path => '/virtual/aaa/bbb/public_html',
dbname => 'testdb',
dbuser => 'username'
};
return bless ($self,$class);
}
sub get_local_path {
my ($self, $name) = @_;
return $self->{'local_path'};
}
--------------------------------------------------
use Config;
$obj=new Config();
$local_path = $obj->get_local_path();
--------------------------------------------------
とするような感じなのですが、なんだかスマートじゃない気がするので
普通ははどんなふうに書くのか教えてもらえますか?
No.3ベストアンサー
- 回答日時:
>今まで、サーバの絶対パスや、データベースの名称などを、
>config.pl というファイルを作って、グローバル変数で宣言していました。
定数を使いたいのであれば型グロブが良いかと思います。
型グロブを使えばget_local_pathの様なアクセサを使う必要はありません。
>でも、オブジェクト指向では、グローバル変数を使わないようにするということで、
『oop=全てパッケージ化しなくてはいけない』ということでは無いと思いますので、私であれば下記のようにします。
init.pm
--------------------------------------------------
*LOCAL_PATH = \"/virtual/aaa/bbb/public_html";
main.cgi
--------------------------------------------------
#!/usr/bin/perl
require "init.pm";
print "Content-type: text/html;\n\n";
print <<"HTML";
<html>
<body>
<img src="$main::LOCAL_PATH/images/abc.gif">
</body>
</html>
HTML
exit;
No.2
- 回答日時:
えぇっと.... あなたが何を期待しているのかが今一つ見えないのですが....
とりあえず
「定数だと埋め込めない」というのは, 「文字列中でその値に展開してくれる」ということだと理解しました.
「get_local_path()などを用意しなくてもいいやり方」については何を期待しているのかよくわかりません.
また, 初期化の方法とか「プログラム中で随時変更できるのかどうか」あたりも作り方に影響することがありえるので, これもあなたがどう期待しているのか書いてもらえるとありがたいかな.
おっと, 「スマートかどうか」の判断基準も欲しいか.
ことによっては tie かなぁ (ぼそっ).
ちなみに最も頭を使わない方法は
package Config;
our $local_parh = "/virtual/xxx/bbb/public_html";
our $dbname = "testdb";
our $dbuser = "username";
1;
と「パッケージの中にグローバルな変数を作る」だったりする.
>「定数だと埋め込めない」というのは, 「文字列中でその値に展開してくれる」ということだと理解しました.
はい。ご理解いただきありがとうございます。
使い道としては、プログラム中では変更の必要はありません。
定数と考えていいのですが、上記の、展開できないことから変数にしたいだけです。
変更が必要ないので、初期化は最初に行われればOKです。
スマートというあいまいな表現をしてしまってすみません。
今までの使い方としては、前述のpathなどのほか、
$toiawasesaki = 'info@example.com';
@seibetu = ("","男性","女性");
@todoufuken = ("北海道","青森","秋田", …);
のような感じです。
簡単なアンケートの項目などもこのように作成していました。
で、このような作り方を多様してるので、一つ一つget_local_path()のような
メソッドを作るのがめんどくさいなぁ~、という感じです。
ただ、現時点ではオブジェクト指向の感覚も分かってないし、
もしかしたら他の人はこのくらいは全然気にならないことなのか、
またはもっと楽な書き方があるのかと思って質問させていただきました。
No.1
- 回答日時:
「オブジェクト指向では、グローバル変数を使わないようにする」というのも, なんだか的を外しているような気がするけど....
その設定が「読み込んだら変更されることはない」というものであれば, 例えば
package Config;
{
my $local_path = ....;
sub get_local_path {
$local_path;
}
}
1;
のようにすることもできます. 使う方では
use Config;
$local_path = Config::get_local_path();
とする. 要は Config の中に隠しているだけですが.
もちろんこの方法が「スマート」かどうかは知りません.
ありがとうございます。
今まで良く使う項目をグローバル変数でたくさん定義していたのですが、
get_local_path()などを用意しなくてもいいやり方とかありましたら
よろしくお願いいたします。
他のサイトで
TestConst.pm
use constant HOGE => ’定数値’;
a.pl
use TestConst;
print ’HOGE=’ . TestConst::HOGE;
と、定数の例が出てましたが、結構普通の事でしょうか?
定数だと
<img src="$local_url/images/abc.gif">
のように埋め込めないのであんまり使いたくないのですが、
そういう問題ではないですか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
perl 初等プログラミングについて
-
openした後、closeしないでプロ...
-
bashスクリプト
-
ターミナルで特定の文字と文字...
-
逆スラッシュを使わずにメタ文...
-
配列へのリファレンスへのリフ...
-
同一の検索値が複数存在する場...
-
Perl n列目の最小値 条件付き
-
Perl 仮登録、本登録システムに...
-
Perl 正規表現
-
Perl テキスト 重複 個数
-
Perl言語について。
-
Strawberry Perl for Windows ...
-
INDIRECT 横に再度抽出したい
-
テキストファイルで提出とは?
-
perl パターンマッチの前後の文...
-
PerlからPython3へ移行したい ...
-
Perl crypt パスワード 暗号化...
-
perl メール 一斉送信プログラム
-
Perlを使ったデータベースから...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CGIの結果をHTMLの一部に貼り付...
-
perlでHTMLを吐き出した画面を...
-
kent-webのpostmai設置について
-
C++からhtmlページを作る
-
HTMLファイルをCSVファイルへ
-
Perl、オブジェクト指向での初...
-
月の第一週とは
-
よくある 『 第○(1・2・3・4・...
-
エクセルで毎月第2週日の水曜日...
-
エクセルで相対パスの書き方を...
-
週2回のペースって だいたい何...
-
apacheでPerl CGIが作動せず、5...
-
毎○曜日って、使いますか?
-
やはり時間割いて叔母の事で10...
-
アンケートなどの1日1回の投...
-
土曜日の26時って何曜日の何時...
-
[Excel] ある日の曜日が当月の"...
-
リストコントロールの列幅を固...
-
DBを10件毎に表示ページング...
-
クライアントのIPとマシン名を...
おすすめ情報