【Perl】他パッケージの変数を不修飾で使用したい


パッケージ A の変数を、パッケージ B にインポートするにはどうすれば良いのでしょうか?
( use strict; します )
( パッケージ B 内で、A::を付けずに利用したい )
( 参照ではなく値コピーがほしい )

よろしくお願いします。
____

package A;
$a = 1;
@b = ( 2 );
%C = ( 3 => 4 );

package B;

$a = 2;
*B = \*A;

use strict; # 必須

printf "\$A::a => %s\n", $A::a;
printf "\$B::a => %s\n", $B::a;
printf "\$ a => %s\n", $a;

____

回答の条件
  • 1人5回まで
  • 登録:2007/07/08 14:17:28
  • 終了:2007/07/15 14:20:12

回答(2件)

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402007/07/08 23:14:50

ポイント35pt

exporter

前提条件が無いので良く分かりませんが、Package A で Exporter を使うのはどうですか?

リンク先ではサブルーチンについて触れられていますが、変数も全て Export できます。

id:radio3

ありがとうございます。

リンク先拝見しましたが解決できませんでした。

要するに package B; 内で、

$a = $A::a;

@b = @A::b;

%c = %A::c;

を実行してくれる方法を探しています。

グロブコピー

*B = *A;

でできると思ったのですが

$B::a = 1 となってくれません。

printf "\$ a => %s\n", $a; # package B; 内で a=>2 となってしまう。

2007/07/09 01:48:27
id:lunlumo No.2

lunlumo回答回数107ベストアンサー獲得回数142007/07/11 01:58:49

ポイント35pt

 調べてみた所,以下の様なやり方でできなくは無い様です。正直お勧めできる処理ではありませんが。

#! /usr/local/bin/perl

package A;

$A::a = 1;
@A::b = (2);
%A::c = (3=>4);

1;

package B;

1;

package main;

use strict;

sub import_by_value {
	my	($source,$destination) = @_;
	no strict 'refs';
	foreach my $value (values %{$source.'::'}) {
		next if (*$value{NAME} eq 'import' || ref(*$value{CODE}) eq 'CODE');
		if (ref(*$value{ARRAY}) eq 'ARRAY') {
			@{$destination.'::'.*$value{NAME}} = @{*$value{ARRAY}};
		} elsif (ref(*$value{HASH})) {
			%{$destination.'::'.*$value{NAME}} = %{*$value{HASH}};
		} else {
			${$destination.'::'.*$value{NAME}} = ${*$value{SCALAR}};
		}
	}
}
import_by_value('A','B');

print "a(B):${B::a} a(A):${A::a}\n";
$B::a=2;
print "a(B):${B::a} a(A):${A::a}\n";

print "b(B):".join(',',@B::b)." b(A):".join(',',@A::b)."\n";
push(@B::b,3);
print "b(B):".join(',',@B::b)." b(A):".join(',',@A::b)."\n";

1;

http://homepage1.nifty.com/nomenclator/perl/perl.htm#symboltable

id:radio3

ありがとうございます!

あまり一般的ではないのですね。

簡単にできるはず、と見込んでおりました...

2007/07/13 13:02:41

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません