• ベストアンサー

リファレンスの機能

リファレンスではサブルーチンとして呼び出すライブラリ自体を変数に格納することができるのでしょうか?その概念がよくわかりません。たとえば HOGE.plというプログラムがあり、 (1)use INILOAD; (2)$HOGE::INI = new INILOAD inifile=>'CONFIG.ini'; (3)($ret, $MESS, $s) = $HOGE::INI->load; このloadがどこのことなのか、を調べているうちにINILOAD.pmのなかにあることがわかったのです。 そこで(3)をとおった時点で$HOGE::INIの中身をlogで確認したら INILOAD=HASH(0x1857b04) が格納されていました。これってINILOAD.pmそのものを格納しているということでしょうか?だとすると上記文でなぜ$HOGE::INIのなかに ライブラリ名が格納されるのですか? 最後にINILOAD.pmのnewを記載します。 sub new { my($class) = shift; my($args) = {@_}; &init(); bless { INIFILE => $args->{inifile} || 'default.ini', }, $class; } sub init { my($self) = shift; $self->{STATUS} = 0; $self->{STATUS_MESS} = 'undefined'; undef $self->{DATA}; } おそらくbless以下の部分がキーになるのかとは思いますが、私の理解は 『ハッシュの引数の値をkey:inifile,値'default.ini'としてこのプログラム上で読めるようにし、それに$classを付加したものをINIFILE というグローバルな変数に代入する』 なのですが、どうもしっくりきません。ご指摘よろしくお願いいたします。

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

  • ベストアンサー
noname#9431
noname#9431
回答No.1

これはクラスを記述するPerl独得のやり方です。 こまかい説明は man perlboot でお調べ下さい。 Googleで調べると日本語訳も見つかると思います。

cshoaucmoa
質問者

お礼

ありがとうございます。 日本語訳見つかりました。まだ完全に読めていませんが、勉強させていただきます。

その他の回答 (2)

  • hikomin
  • ベストアンサー率63% (40/63)
回答No.3

補足です。 既にあるとおり、これはオブジェクト指向で書かれているわけですが、問題はコンストラクタ(ここではnewメソッド)の最後のblessです。blessはオブジェクト生成に使う関数で、クラスの名前を結びつけたリファレンスを作成します。INILOAD=HASH(0x1857b04) となっているのは、INILOADと結びつけられたHASHである事を表しています。これによって、オブジェクトが迷わず自分の名前(クラス名)を知る事が出来るわけです。 例えば$HOGE::INI->load;と言う風にloadメソッドを呼んでも、$HOGE::INIが何に属しているかを知らなければ(他のクラスでもloadメソッドを定義しているかもしれないわけで)どのloadメソッドなのか分かりませんが、Perlでは上記のやり方で、属しているクラスを示しているわけです。

cshoaucmoa
質問者

補足

回答ありがとうございます。 bless自体、まだあまり理解できていないのですが、要は 『”$HOGE::INI = new INILOAD inifile=>'CONFIG.ini';”で与えた引数 inifile=>'CONFIG.ini'というものをINILOAD.pm上で{inifile} || 'default.ini'(inifileもしくはdefaule.ini)として紐付け、INILOAD.pmで使用できるようにする』といった感じでしょうか?

回答No.2

これは、たぶんクラスの指定かと思われます。 use INILOAD; これは、INILOADというクラスを使用するという宣言。 $HOGE::INI = new INILOAD inifile=>'CONFIG.ini'; $HOGEという名前空間の中のINIという変数にINILOADのクラスを引数鍵がinifile、値がCONFIG.iniというハッシュを引数として作成。 ($ret, $MESS, $s) = $HOGE::INI->load; $HOGE::INIに格納されたクラスのうちloadを実行。 その戻り値として$ret,$MESS,$sを返す。 たぶん、これで間違いないはずです。 .pmは、パールモジュールなので、クラス指向言語のはずですので、

cshoaucmoa
質問者

お礼

どうもありがとうございました。 なかなか考え方自体を改革するのは難しいのですが、少しずつPERLに慣れていきたいと思います。

関連するQ&A