クラスのコンストラクタに配列を渡すには、以下のようにします。
main.pl
#!/opt/local/bin/perl;
package main;
use utf8;
use TestSub;
use Clone qw(clone);
@foo = ('A','B','C'); # 配列を作って
my $s = TestSub->new(\@foo); # コンストラクタに渡します
@foo = ();
$s->hello();
TestSubクラスを生成して配列(foo)を渡しています。
その後、TestSubクラスのhelloメソッドを呼び出しています。
helloメソッドは受け取った配列を表示するようにしています。
呼ばれる側のソースは以下のようになります。
TestSub.pm
package TestSub;
use utf8;
use Clone qw(clone);
sub new {
$self = shift; # クラス名を取得します
$ref = shift; # 配列への参照を受け取ります
my $array = clone($ref); # 配列の中身をコピーします
my @array2 = (4, 5, 6); # もう1つ別のメンバ変数を作っています
my $data = { # メンバ変数を作っています
ref => $array, # 引数で渡された配列
ref2=> \@array2, # ついでにもう1つ配列
};
return bless $data, $self; # blessでメンバ変数とクラスを関連付けて返却
}
sub hello {
my $self = shift; # クラス名を取得します
my $test = $self->{ref}; # メンバ変数refを取得します
foreach my $ref(@$test) {
print "hello ref1:$ref\n";
}
my $test2 = $self->{ref2};
foreach my $ref(@$test2) {
print "hello ref2:$ref\n";
}
}
1;
ミソとしては、配列の参照を受け取るだけなので、コンストラクタ内でコピーしてあげないといけない点です。上記ではcloneを呼び出して配列をコピーしています。(もちろんCloneを使わずに愚直に1要素づつコピーしてもOKです。)
実行結果は以下のようになります。
hello ref1:A
hello ref1:B
hello ref1:C
hello ref2:4
hello ref2:5
hello ref2:6
0 件のコメント:
コメントを投稿