26章 Perlでオブジェクト指向 メンバーデータの書き方

メンバーデータは パッケージのモジュール内に記述します。

my $a,$b; はメンバーデータです。
set()でメンバーデータに入力し、
calc2()でメンバーデータを取り扱って計算しています。

ファイル名:Human.pm

package Human;
use strict;my $a;
my $b; # private 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;

実行ファイル名:test1.pl

use strict;
use Data::Dumper;
use Human;my $man = Human->new();
$man->set( 1 ,2 );
$man->calc2( );

実行結果:

>perl test1.plHuman->calc2 = 3

 

では次に
実行ファイル名:test2.pl

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

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

$man->calc2( );
$man2->calc2( );

実行結果:

>perl test1.pl

Human->calc2 = 11
Human->calc2 = 11

 

あれ、最初の回答が3ではなく11になっています。
$man2->set(5,6)
がなぜか$man のメンバーデータまでセットしています。

実はmyで宣言する方法は、オブジェクトの共有変数だったのです。
生成されたオブジェクト$man,$man2の共有変数なのでした。
myをlocalに変えても同じです。

では次に
実行ファイル:test3.pl

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

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

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

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

実行結果:

 >perl test3.pl
Human->calc2 = 3
Human->calc2 = 3
Human->calc2 = 3

計算結果は全部3でした。
300という計算結果ではありません。
データの隠ぺいはできています。

myで宣言する方法は、
publicのように直接アクセスはできません。
$Human::a とか $man::a の記述ではアクセスできません。