8章 Perlでオブジェクト指向 グローバルなメンバーデータの書き方

グローバルメンバーの書き方

メンバーデータは パッケージのモジュール内に記述します。
ourでメンバーデータを定義してみましょう。

ファイル名:Human.pm

package Human;

our $a;
our $b; # public data
###########
sub new
{
my $class = shift;
my $args = shift;
my $self = {};
bless($self, $class);
return $self;
}
###############
sub set
{
my ($self,$x, $y)  = @_ ;
$a = $x;
$b = $y;
}
###############
sub calc2
{
my ($self)  = @_ ;

my $c = $a + $b ;
print “Human->calc2 = $c \n”;
}
##############
1;

実行結果:1

実行ファイル名:test1.pl

実行ファイル内容:

use  Human;

my $man = Human->new();
$man->set( 1 ,2 );
print “–man —  “;
$man->calc2( );

my $man2 = Human->new();
$man2->set( 5 ,6 );
print “–man2 —  “;
$man2->calc2( );

print “–man —  “;
$man->calc2( );

実行結果:

>perl test1.pl

–man —  Human->calc2 = 3
–man2 —  Human->calc2 = 11
–man —  Human->calc2 = 11

3番目は3ではなくて11になっています。
$man2->set( 5 ,6 );によって$manのデータまで書き換えられています。
つまり、our $a , our $b はオブジェクト$man,$man2の共有変数になっています。

実行結果:2

つぎにtest2.plを実行してみましょう。
実行ファイル:test2.pl

実行ファイル内容:

use strict;
use Data::Dumper;
use Human;

my $man = Human->new();
my $man2 = Human->new();
$man->set( 1 ,2 );
$man->calc2( );

$Human::a = 100;
$Human::b = 200;
$man->calc2( );
$man2->calc2( );

$man::a = 40;
$man::b = 50;
$man->calc2( );
$man2::a = 41;
$man2::b = 52;
$man2->calc2( );

実行結果:

>perl test2.pl

Human->calc2 = 3
Human->calc2 = 300
Human->calc2 = 300
Human->calc2 = 300
Human->calc2 = 300

ourで宣言したデータに
$Human::a
という記述でアクセスできます。
共有変数なので$manにも$man2にも反映されています。
100+200=300という結果が出ています。

また、
$man::a
という記述ではアクセスできません。
41+52=93という結果は出てきませんでした。

タイトルとURLをコピーしました