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
No.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間で共有できていないようですが、あいかわらずよくわかっていません。。。
とりあえず閉めさせていただきます。
ありがとうございます。
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を使うという方向で、試してみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- Perl perlの構文でカンマの意味が分からない 2 2022/10/30 01:53
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- その他(プログラミング・Web制作) Pythonで会員サイトの自動ログイン ID Nameがない 1 2022/12/16 02:09
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Ruby パイソンのクラスについて 3 2023/06/20 07:30
- その他(クラウドサービス・オンラインストレージ) Google ColabでGoogleドライブのサブフォルダにファイルを生成する方法 1 2022/10/31 17:37
- 英語 英語ができる方に質問です。 以下の文がネイティブの方に伝わるかどうかを確認していただけないでしょうか 7 2022/12/16 14:54
- PHP PHP ページング データベース 1 2022/06/16 10:30
- JavaScript WordPressのコンタクトフォーム7にて送信者の位置情報を送らせたい 2 2022/09/14 23:28
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
例外処理のフローチャートの記...
-
同じコンボボックス、リストボ...
-
モジュールとサブルーチン
-
サブルーチンを使った再帰的な...
-
use baseしたpackageのローカル...
-
Excel VBAで、ユーザーフォー...
-
”:”がいっぱいの文について。
-
フォートランのサブルーチンの...
-
タイマーで動かすselect caseの...
-
perlの構文でカンマの意味が分...
-
Perlのサブルーチンの引数引継ぎ?
-
smallbasic について教えてくだ...
-
Attempt to free unreferenced ...
-
ファイルを出力させる方法
-
ユーザー定義関数に#NAME?が返...
-
Excel VBAでリンク切れをチェッ...
-
Perl5.8とPerl5.6は共存可能で...
-
VBAで別モジュールへの変数の受...
-
'Range'メソッドは失敗しました
-
XML::XPathで日本語検索するには
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
例外処理のフローチャートの記...
-
Excel VBAで、ユーザーフォー...
-
COBOLで、Shellを起動するには?
-
モジュールとサブルーチン
-
”:”がいっぱいの文について。
-
ExcelVBA AddinでOnAction
-
オフコン(富士通Kシリーズ)...
-
ACCESSのVBAでPrivate Sub ~en...
-
VBAで2重のDoLoop関数から抜け...
-
fortran95実行エラー
-
perlの構文でカンマの意味が分...
-
プログラムの可読性が悪いです...
-
Perlのサブルーチンの引数引継ぎ?
-
サブルーチンを認識しません。
-
GOSUB命令とは
-
Inline CでOpenMPは使えますか?
-
初歩的な質問なのですが、サブ...
-
サブルーチンに引数を2つ以上...
-
BASIC言語で時差を求めるには?
-
cobol サブルーチンのlink
おすすめ情報