読者です 読者をやめる 読者になる 読者になる

はむはむエンジニアぶろぐ

このブログのコンセプトは"ハッキングの為なら愛する家族を傷つけることをいとわない" 自分にとってエンジニアリングは "手段ではなく生きる目的" である

Perl クラス変数とメンバ変数

Perl オブジェクト指向

Perlでクラス変数とメンバ変数の違いを見ていきます。

my $hoge;

sub new {
    my $class = shift;
    return bless { hoge => undef }, $class;
}

クラス内で、 宣言された$hogeblessされたhoge
前者はクラス変数、後者はメンバ変数です。

環境構成

  • Perl 5.16


クラス変数とメンバ変数

クラス変数 は、静的メンバ変数とも呼ばれる。
同一・派生クラスで共有される変数のことである。
インスタンスが異なっていても変数の値は共有される。


それに対し、 メンバ変数 はインスタンスごとで変数の値を持つ。
インスタンスが異なれば、変数の値も異なる。

やってみる

SampleClass は、 $new_count という クラス変数arg1 という メンバ変数 を持つ。

package SampleClass;

use 5.016;
use strict;
use Data::Dumper;

my $new_count = 0;

sub new {
    my $self = shift;
    $new_count++;
    return bless { arg1  => shift }, $self;
}

sub get_arg1 {
    my $self = shift;
    return $self->{arg1};
}

sub get_new_count {
    my $self = shift;
    return $new_count;
}

1;


実行コード

use 5.016;
use strict;
use SampleClass;

my $sc1 = new SampleClass('おはよう');
my $sc2 = new SampleClass('こんにちわ');

print $sc1->get_arg1() . "\r\n";
print $sc2->get_arg1() . "\r\n";

print $sc1->get_new_count() . "\r\n";
print $sc2->get_new_count() . "\r\n";

1;

実行結果

実行結果は以下のとおり。

おはよう
こんにちわ
2
2

arg1 は、インスタンス変数のため、インスタンスごとで共有されない値を持っている。
new_count は、クラス変数のため、クラスごとで共有される値を持っている。

Perlのクラスのインスタンスの実体は $selfbless したものである。

print Dumper $sc1;

$VAR1 = bless( {
                 'arg1' => 'おはよう'
               }, 'SampleClass' );

このインスタンスの実態が持っていない変数は、メンバ変数ではありません。
メンバ変数はインスタンスを bless することで、 $self にハッシュのリファレンスを結びつけます。

参考リンク :トムによる Perl オブジェクト指向チュートリアル

最近読んだ本

Perl徹底攻略 (WEB+DB PRESS plus)

Perl徹底攻略 (WEB+DB PRESS plus)

  • 作者: 大沢和宏,cho45(さとう),小林篤,和田裕介,嶋田裕二(xaicron),牧大輔(lestrrat),奥一穂,広木大地,伊藤直也,長野雅広,藤原俊一郎,伊藤智章,まかまか般若波羅蜜,小飼弾,近藤嘉雪,中川勝樹,宮川達彦,tokuhirom,藤吾郎(gfx),村瀬大輔,WEB+DB PRESS編集部
  • 出版社/メーカー: 技術評論社
  • 発売日: 2013/07/23
  • メディア: 大型本
  • この商品を含むブログ (9件) を見る

Effective Perl 第2版

Effective Perl 第2版

Perl テスティング ハンドブック

Perl テスティング ハンドブック