dポイントプレゼントキャンペーン実施中!

packageを継承した場合、
継承先(以下のMyPkg)で継承もと(MyBase)のローカル変数($localValue)を直接書き換える方法はありませんか?

package MyBase;
my $localValue;

sub doBase{
my $self=shift;
$localValue ={ 'hanako'=>{'id'=>1, 'pref'=>'tokyo'} };
}
sub getPref {
my $self=shift;
my $name=shift;
$localValue->{$name}{'pref'};
}

package MyPkg;
use base qw(MyBase);
sub new{
my $class=shift;
my $self={};
bless $self, $class;
return $self;
}

sub doAnything {
# この中でMyBaseの$localValueを直接書き換えたい
$localValue ={ 'taro'=>{'id'=>2, 'pref'=>'osaka'} };
}

------main::
my $pkg=new MyPkg;
$pkg->doSomething;
print $pkg->getPref('hanako');

$pkg->doAnything;
print $pkg->getPref('taro');


----------
以下のような感じでmyBaseの中に$localValueを返すサブルーチンを作っておけば、
print $pkg->localValue->{'hanako'}{'pref'};
などと取得は出来ますが、
$pkg->localValue->{'hanako'}{'pref'}='kyoto';
のような代入は無理みたいでした。

package MyBase;
my $localValue;

sub localValue{
my $self=shift;
$localValue;
}


doBaseのようなサブルーチン経由で書き換えていますが、
use baseしていても、やはりそうしないとダメでしょうか。

Windows、ActivePerl、perl 5.10.0
Linux、Perl5.8

A 回答 (1件)

my $localValueの所をour $localValueとし、doAnything内で$MyBase::localValueのようすればその変数に直接アクセスできます。


ourはパッケージ変数を宣言するものです。
パッケージ変数については参考URLをどうぞ。

http://www.google.co.jp/search?hl=ja&q=perl+%83p …[%83W%95%CF%90%94&lr=lang_ja
http://d.hatena.ne.jp/perlcodesample/20080308/12 …

この回答への補足

うまくourが機能してないというか、
package間で共有できていないようですが、あいかわらずよくわかっていません。。。
とりあえず閉めさせていただきます。

補足日時:2009/06/14 08:49
    • good
    • 0
この回答へのお礼

ありがとうございます。
sub doBaseじゃなくて、sub doSomethingの書き間違いです。
BBS投稿時に書き換え漏れたようで。。。m(_ _)m

やっぱりourですか、、、、

http://perldoc.perl.org/functions/our.html
ここのサンプルを読んでourにしてみたのですが、
print $pkg->getPref('hanako'); これで何も出力されずでした。

このページのサンプル
> package Foo;
> our $bar;
> $bar = 20;
>
> package Bar;
> print $bar;
をそのまま試しても何も出力されずで、よくわからない状態です。

ourを使うという方向で、試してみます。

お礼日時:2009/06/11 13:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!