クラスサンプル
まずは、クラス定義から。
# クラスのパッケージ名を宣言 package ClassTest; use Exporter ; @ISA = (Exporter) ; @EXPORT = (new,TestMethod) ; use strict ; sub new{ # 暗黙のうちに引き渡されるクラス名を受け取る my $class = shift; # ここの$selfこそがインスタンス変数そのもの # インスタンスメソッド実行時は$selfに詰め込まれたスカラー、配列、リファレンスを # 展開して使うことでインスタンスとして振舞う my $self = { ARYREF => []} ; # bless したオブジェクトリファレンスを返す return bless $self, $class; } sub TestMethod { my $self = shift ; my $invar = shift ; print "input is $invar\n" ; push (@{$self->{ARYREF}},$invar) ; foreach my $item (@{$self->{ARYREF}}) { print "$item" ; } print "\n" ; } return 1;
コンストラクタはnew。別にnewって名前である必要は必ずしもない。が、まあ、お約束で。真ん中ぐらいで$selfにインスタンス変数をハッシュとして入れている。中身はARYREFって名前のハッシュキーと、無名配列へのリファレンス。これで$self->{ARYREF}とすることで無名配列へのリファレンスが取り出せる。無名配列は都度メモリが割り当てられるみたいなので、これで各インスタンス固有の配列を持つ事が出来る。
次がテスト用のコード。
use ClassTest ; my $myClass1 = ClassTest->new() ; my $myClass2 = ClassTest->new() ; my $myClass3 = ClassTest->new() ; $myClass1->TestMethod('A') ; $myClass2->TestMethod('a') ; $myClass1->TestMethod('B') ; $myClass2->TestMethod('b') ; $myClass3->TestMethod('fugafuga') ;
これの実行結果は下の通り。
input is A A input is a a input is B AB input is b ab input is fugafuga fugafuga