Perlオブジェクト指向での初期設定ファイルについて

このQ&Aのポイント
  • Perlオブジェクト指向における初期設定ファイルの作成方法について解説します。
  • 従来のグローバル変数を使った初期設定ファイルの代替手法として、オブジェクト指向のアプローチを紹介します。
  • 例として、config.pmを使用して初期設定情報を管理する方法を説明します。
回答を見る
  • ベストアンサー

Perl、オブジェクト指向での初期設定ファイルについて。

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(); -------------------------------------------------- とするような感じなのですが、なんだかスマートじゃない気がするので 普通ははどんなふうに書くのか教えてもらえますか?

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

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

  • ベストアンサー
  • an631
  • ベストアンサー率82% (28/34)
回答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;

kt_yuka
質問者

お礼

ありがとうございます。 簡単でいいですね。 型グロブに関してもやはり今までなじみが無いので、 使いこんでみようと思います。

その他の回答 (2)

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

えぇっと.... あなたが何を期待しているのかが今一つ見えないのですが.... とりあえず 「定数だと埋め込めない」というのは, 「文字列中でその値に展開してくれる」ということだと理解しました. 「get_local_path()などを用意しなくてもいいやり方」については何を期待しているのかよくわかりません. また, 初期化の方法とか「プログラム中で随時変更できるのかどうか」あたりも作り方に影響することがありえるので, これもあなたがどう期待しているのか書いてもらえるとありがたいかな. おっと, 「スマートかどうか」の判断基準も欲しいか. ことによっては tie かなぁ (ぼそっ). ちなみに最も頭を使わない方法は package Config; our $local_parh = "/virtual/xxx/bbb/public_html"; our $dbname = "testdb"; our $dbuser = "username"; 1; と「パッケージの中にグローバルな変数を作る」だったりする.

kt_yuka
質問者

お礼

>「定数だと埋め込めない」というのは, 「文字列中でその値に展開してくれる」ということだと理解しました. はい。ご理解いただきありがとうございます。 使い道としては、プログラム中では変更の必要はありません。 定数と考えていいのですが、上記の、展開できないことから変数にしたいだけです。 変更が必要ないので、初期化は最初に行われればOKです。 スマートというあいまいな表現をしてしまってすみません。 今までの使い方としては、前述のpathなどのほか、 $toiawasesaki = 'info@example.com'; @seibetu = ("","男性","女性"); @todoufuken = ("北海道","青森","秋田", …); のような感じです。 簡単なアンケートの項目などもこのように作成していました。 で、このような作り方を多様してるので、一つ一つget_local_path()のような メソッドを作るのがめんどくさいなぁ~、という感じです。 ただ、現時点ではオブジェクト指向の感覚も分かってないし、 もしかしたら他の人はこのくらいは全然気にならないことなのか、 またはもっと楽な書き方があるのかと思って質問させていただきました。

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

「オブジェクト指向では、グローバル変数を使わないようにする」というのも, なんだか的を外しているような気がするけど.... その設定が「読み込んだら変更されることはない」というものであれば, 例えば package Config; { my $local_path = ....; sub get_local_path { $local_path; } } 1; のようにすることもできます. 使う方では use Config; $local_path = Config::get_local_path(); とする. 要は Config の中に隠しているだけですが. もちろんこの方法が「スマート」かどうかは知りません.

kt_yuka
質問者

お礼

ありがとうございます。 今まで良く使う項目をグローバル変数でたくさん定義していたのですが、 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

  • perl ftp取得したファイルの保存先設定

    perl初心者です。 FTPサーバーのLOGを取得する場合のプログラムをperlで作成しております。 保存先設定を1回(1行)設定しただけで設定先フォルダにLOGファイルが保存されるような方法はありますでしょうか? 今現在以下のように保存先を指定して取得しています。 my $local_file1 = 'C:/log/aaa.csv''; my $local_file2 = 'C:/log/bbb.csv'; my $local_file3 = 'C:/log/ccc.csv'; $ftp->get('取得元パス/aaa.csv',$local_file1); $ftp->get('取得元パス/bbb.csv',$local_file2); $ftp->get('取得元パス/ccc.csv',$local_file3); ただ、1ヶ月分のLOGを取得するとなるとmy $local_fileも$ftp->getも1ヶ月分作成しなければならないため長文のプログラムになってしまいます。 他、1ヶ月分ならFor文でこんな感じでやれば・・・というアドバイスがあればお願いいたします。

    • ベストアンサー
    • Perl
  • オブジェクトの参照を返す関数の扱い

    オブジェクトの作成と関数との関係を勉強していますが参照の使い方に関して質問させていただきたいと思います。 以下のような簡単なプログラムを作りました。 myclass.cpp myclass.h で記述されたクラスmyclassは整数を一つ持ち、show_value関数でその整数を表示し、say_heyで"hey"という文字を出力するというものです。 このクラスを利用するプログラムとしてmain.cppをつくりました。このなかには2つの関数が使われます。 -オブジェクトをつくりそれをオブジェクトとして返す関数(return_obj)   -オブジェクトをつくりそれの参照を返す関数(return_ref_obj) これらの関数を用いてオブジェクトをつくり、そのオブジェクトを戻り値としてmainのなかでオブジェクトのshow_value関数で保持する整数を表示する、というものです。 myclass.h-------------------------------- class Myclass{ public: int my_int; Myclass(); ~Myclass(); void show_value(); void say_hey(); }; myclass.cpp---------------------------------- #include "myclass.h" #include <iostream> using namespace std; Myclass::Myclass(){}; Myclass::~Myclass(){}; void Myclass::show_value(){ printf("%d\n", my_int); } void Myclass::say_hey(){ printf("hey\n"); } main.cpp------------ #include <iostream> #include "myclass.h" using namespace std; //オブジェクトをつくりそれをオブジェクトとして返す関数(return_obj)   Myclass return_obj(int int_in){ Myclass myobject; myobject.my_int = int_in; //引数をオブジェクトのmy_intに渡す return myobject; } //オブジェクトをつくりそれの参照を返す関数(return_ref_obj) Myclass& return_ref_obj(int int_in2){ Myclass myobject; myobject.my_int = int_in2;   //引数をオブジェクトのmy_intに渡す Myclass& ref_of_myclass = myobject; return ref_of_myclass; } void main(){ Myclass returned_obj = return_obj(1); //関数に1を渡し、1を保持するオブジェクトを作成 returned_obj.show_value(); //整数(1)表示 returned_obj.say_hey(); Myclass& ref_obj = return_ref_obj(2); //関数に2を渡し、2を保持するオブジェクトを作成し参照として受け取る ref_obj.show_value(); //整数(2)表示 ref_obj.say_hey(); } プログラムを実行した出力------------------- 1 hey -858993460 hey このようにオブジェクト自体を返してコピーしたもの(return_obj使用)はshow_valueでただしくオブジェクトに保持された数が表示されますが 参照でオブジェクトを返したもの(return_ref_obj使用)はアドレスのような数列が表示されます。 質問A これはオブジェクトの参照を返す関数(return_ref_obj)でオブジェクトを作成しても、そのオブジェクトが関数の中でのみ実在しており、関数がおわるとその実体がなくなるためではないかと解釈しているのですがそれで正しいでしょうか? 質問B 関数でオブジェクトを作成してそれをプログラム本体に渡すときはreturn_objのようにオブジェクト自体をコピーしなければ参照などで渡すことはできないのでしょうか? クラスと参照自体勉強を始めたばかりで色々と初歩的な間違いもあるとは思いますが、よろしくお願いします

  • wp-config.phpが作れない

    wordpressをインストールしようとしています。 (「WordPressレッスンブック」を見ながら) 画面で、データベースの情報を入力するところがあります。 この画面を使わなくてても、wp-config-sample.php を開き、データベース接続の詳細を記入してこのファイルの名前を wp-config.phpで保存すればいいそうです。 つまり目的は、wp-config.phpを作る過程です。 何度やってもうまくいきません。 白紙画面が出ます。 そのうち、下記の画面がでます。 Warning: require_once() [function.require-once]: Unable to access /virtual/(ドメイン名)/public_html/wp/wp-includes/pomo/translations.php in /virtual/(ドメイン名)/public_html/wp/wp-admin/setup-config.php on line 186 Warning: require_once(/virtual/(ドメイン名)/public_html/wp/wp-includes/pomo/translations.php) [function.require-once]: failed to open stream: No such file or directory in /virtual/(ドメイン名)/public_html/wp/wp-admin/setup-config.php on line 186 Fatal error: require_once() [function.require]: Failed opening required '/virtual/(ドメイン名)/public_html/wp/wp-includes/pomo/translations.php' (include_path='.:/usr/local/lib/php') in /virtual/(ドメイン名)/public_html/wp/wp-admin/setup-config.php on line 186 データベース情報はまちがってないんです。 わざとスペルミスで間違うと、「データベース接続確立のエラー」が出るからです。 上記のような画面が出るのはどういうことでしょうか?

  • ハッスルサーバーwordpressの初期設定

    初心者の質問です。windows7でwordpress導入のためインストール、 アップロードときて、データベースまで終え初期設定でつまずい ています。MySQL 5.0.xのデータベースは問題なし。管理ツールにて ユーザー名・パスワードを打って確認しました。phpMyAdmin には私のホルダあり。 当初、マニュアルにしたがって「設定ファイルを作成する」 にてデータベースの情報を記入。すると、 「データベース接続確立のエラー」と表示されます。 自己解決できなかったので、wp-config-sample.phpを書き替えて アップロードすることにしました。 sakuraエディタにてwp-config-sample.phpを適切に書き替え、 フェイル名wp-config、ユーザー指定PhP、文字コードセット UTF-8、改行コード変換なし、BOMにチェック入れずでアップロード。 もともとのwp-config-sample.phpはサーバーから削除しました。 すると以下のメッセージです。 Warning: require(/home/●●/public/www/wp-includes/load.php) [function.require]: failed to open stream: No such file or directory in /home/●●/public/www/wp-settings.php on line 21 Fatal error: require() [function.require]: Failed opening required '/home/●●/public/www/wp-includes/load.php' (include_path='.:/usr/local/share/pear') in /home/●●/public/www/wp-settings.php on line 21 ハッスルサーバーはwp-config-sample.phpを書き替えなくても アップロードするだけでwordpressの設定画面に行けますが、 データベースに問題ありでその次のステップに行けないということで、 詳しい方、対処法を教えてください。

  • my.iniで設定するパスワードの意味がよくわかりません

    4.0.16から、4.0.26にバージョンアップしたのですが、root権限や、パスワードが よくわかりません。 4.0.16の時は、mysql.exeを開き、DOS窓で「show databases;」とたたくだけで、 testとmysqlが表示されましたが、 4.0.26や、4.1x系ですと、testしか表示されません。たとえば、 show databases -A -uroot -pPASSWORD;  や、 show databases -A -urootD;  などととやっても、↓のようになってしまいます。 ERROR 1064: You have an error (中略)'-A -uroot -p PASSWORD' at line 1 他方、4.0.26で、my.iniに、   [WinMySQLadmin]   user=root   password=mypassword と設定してあるものが認識されていないようです。 既存のPHP+MySQL4.0.16(ローカルで使うだけのものなので、ユーザー名、パスワードなし)で 構築したPHPプログラムがあるのですが、これを 今回インストールしたMySQL 4.0.26の組み合わせに適用しても動かなかったので、   $DBSERVER = "localhost";   $DBUSER = "root"; //←ここと、   $DBPASSWORD = "mypassword"; //←ここです   $DBNAME = "mydb";   $con = mysql_connect($DBSERVER, $DBUSER, $DBPASSWORD);   $selectdb = mysql_select_db($DBNAME, $con); とやってみましたが、エラーになってしまうので、   $DBPASSWORD = ""; //←ここを空白にする とやったら、MySQLに接続できました。 my.iniに記入したものは、適用されていないのでしょうか?

    • ベストアンサー
    • MySQL
  • perlでのオブジェクト指向の書き方

    以下のPHPソースをPerlで書き直したいのですが、Perlのコンストラクタがイマイチわからないので どなたかご教授ください。 可能であれば以下のソースのperlバージョンを記載して頂けると幸いで御座います。 ○呼び出し側 ・index.inc require_once('common.inc'); require_once('db.inc'); class index {     var $objCommon= '';     var $objDB= '';     function index() {         $this->objCommon = new common;         $this->objDB = new db("mysql");     }     function main() {         //DB接続         $db_connect = $this->objDB->connect();         //DBから値を取得         $data = $this->objDB->sample($db_connect);     } } ○呼び出される側 ・db.inc class db{     var $db_dsn_type;     function db_wrap($db_type){         $this->db_dsn_type = $db_type;         $this->objCommon = new common;     }     各function } ・common.inc class common{     各function } ※コンストラクタなし

  • perl の複雑(?)なクラス定義(データ構造)

    以下のようなクラスを作成したいのですが、どのようにクラスとして定義して、どのように呼び出せばよいのでしょうか。特に「score」の部分の記述方法が良く分かりません。 オブジェクト指向(とくにPerl)はあまり経験がない初心者です。 -------------------- データ構造 name addr score--+-- math +-- english +-- science -------------------- クラス記述 package myClass; $ref_score->{math} = '30'; # <-- 正しい? $ref_score->{english} = '40'; # <-- 正しい? # ... sub new { my $class = shift; my $self={}; $self->{name} = 'tanaka'; $self->{addr} = 'tokyo'; $self->{score} = $ref_score; # <-- 正しい? bless $self, $class; } -------------------- メイン文 package main; $inst[0] = myClass::new(); $inst[0]->{name} = "OVERWRITE_NAME"; $inst[0]->{score}->{math} = "OVERWRITE_SCORE_MATH"; print $inst[0]->{module}."\n"; # 出る print $inst[0]->{score}->{math}."\n"; # オーバーライトした値は出るが... print $inst[0]->{score}->{english}."\n"; # 初期値のままの値は表示してくれない... 宜しくお願いいたします。

  • フォルダ関連のライブラリについてアドバイスしてもらえないでしょうか?

    フォルダ関連のライブラリについてアドバイスしてもらえないでしょうか? phpのフォルダ関連の操作がそのままだと少し面倒な感じがしたので 自分でライブラリのようなものを作りたいと思いました。 ------------------------------------------------------------------------------------------ calss My_Directory { const SIZE_FORMAT_B = 0; const SIZE_FORMAT_KB = 1; const SIZE_FORMAT_MB = 2; const SIZE_FORMAT_GB = 3; // フォルダへのパスを指定してオブジェクトを作成。 __construct($dir_path); // フォルダのサイズを取得。$recursiveがtrueで再帰的に全階層のファイルを調べる。 getSize($recursive = true, $sizeFormat = self::SIZE_FORMAT_B, $round = 2); // フォルダの削除。中に入っているファイルも削除される。 delete(); // フォルダに入っているファイル名を取得。$recursiveがtrueで再帰的に全階層のファイル名を取得。 // その場合、配列の配列形式にする。 getFileNames($recursive = true); } $path = 'C:\myfolder';// ローカル環境 $dir_obj = new My_Directory($path); echo $dir_obj->getSize(true, My_Directory::SIZE_FORMAT_MB, 1).'MB';// 例えば、「22.3MB」と表示される print_r($dir_obj->getFileNames()); /*例えば、 Array ( [0] => file_1 [1] => file_2 [2] => file_3 [sub_dir] => Array ( [0] => sub_dir_file_1 [1] => sub_dir_file_2 [sub_sub_dir] => Array ( [0] => sub_sub_dir_file_1 ) ) ) でも結局foreachのループで再帰的に調べることになるから、やっぱりめんどうだなぁ・・・ */ $dir_obj->delete();// myfolderが削除される ------------------------------------------------------------------------------------------ ただ、deleteした後にgetSizeとか実行した場合に、 例外を投げればいいのかなぁと考えたりしたのですが、 そもそもオブジェクトにして扱うこと自体が適切なのかどうか? だからフォルダ関連のライブラリがあまり存在しないのかなと思ったりしたのですが、 今回のようにライブラリを作ることに対してのアドバイス(自分ならこうするとか、ここはそんな風にやらないとか) など些細なこともでいいので教えてもらいたいです。

    • ベストアンサー
    • PHP
  • OpenPNE設置時のエラー

    こんにちは。 自社サーバにSNSのOpenPNEを設置しようとしています。 手順書通りにインストールした後、セットアップ画面にアクセスしようとすると、真っ白な画面になってしまいます。 エラーログを見ると、 PHP Warning: main(/usr/local/OpenPNE/config.php): failed to open stream: Permission denied in /var/www/pne/OpenPNE/public_html/config.inc.php on line 21 PHP Fatal error: main(): Failed opening required '/usr/local/OpenPNE/config.php' (include_path='.:/usr/share/pear') in /var/www/pne/OpenPNE/public_html/config.inc.php on line 21 と書いてありました。 これはPHPのエラーでしょうか。 config.phpファイルの中身が悪いのでしょうか・・・。 PHP及び、サーバ・データベースなどについて、ほとんど初心者です・・・。 (そして英語もよくわかってない・・・) ひょっとしたら、すっごく単純な間違いかもしれませんが、 ご指南の程、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPメールフォームの設定

    コアサーバーに、PHPのメールフォームのインストールをしようとしていますが、 うまくいきません。 どなたか、ご教授頂ければ幸いです。 インストールしようとした、PHPメールフォームは、下記の2つです。 1.ES-FORM 2.Mailform+ Version1.24 (携帯対応埋め込み型PHPメールフォームスクリプト) どちらもサーバーに設置して、アクセスなどをしますが、 フォームがキチンを表示されません。 どちらも、.htaccessを設置したりして、試行錯誤していますが、うまく動きません。 ES-FORMは、フォームがうまく表示できないので、 サーバーの説明によるエラー対策を http://www.coreserver.jp/help/index.php/phperror/ を試みましたが、うまくいきません。 Mailform+ Version1.24 は、パスの設定がうまくいかないようです。 Warning: include() [function.include]: Unable to access /virtual/ken/public_html/■■■■.■■■■/mail/mfp/config.inc.php in /virtual/■■■■/public_html/■■■■/mail/index.php on line 5 などのエラーがでます。 いま、完全にはまってしまい、暗中模索になってしまいました。 恐縮ですが、素人ゆえ、わかりやすく解説、設定方法など ご教授頂ければ幸いです。 以上、よろしくお願いいたします。

    • 締切済み
    • PHP

専門家に質問してみよう