人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

【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;

____

●質問者: radio3
●カテゴリ:コンピュータ
✍キーワード:Perl インポート コピー パッケージ 変数
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● b-wind
●35ポイント

exporter

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

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

◎質問者からの返答

ありがとうございます。

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

要するに 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 となってしまう。


2 ● lunlumo
●35ポイント

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

#! /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

◎質問者からの返答

ありがとうございます!

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ