2016-12-28 6 views
3

複数のユーザーハッシュに汎用ハッシュ(マクロ)を組み込む必要があります。実際には、これらはすべてPerlでHoH/HoLとして書かれた仕様です。ローカル変数をperlのグローバルハッシュに組み込む

私は 'user'仕様でマクロ仕様を独自の変更で採用したいと思います。以下の例では、変数 '$ v_Y'は、user1とuser2に異なる値を持つ必要があります。

私は以下のコードは正確にはコードではありませんが、問題を説明するためのものです。 macro_specが既に作成されているので、$ v_Yの複数の値を持つことができません。メルポメネ同様

## this is in a package 
my $MACRO_SPEC = { 
    mkeyX => "value_X", 
    mkeyY => $v_Y, 
}; 

#this is USER1 package, 
$v_Y = "U1_VALUE_X"; 
# use MACRO_SPEC 
my $USER1 = (
    u1key1 => "u1value1",  u1macrokey => $MACRO_SPEC, # need macro to interpolate 'local' $v_Y 
); 

#this is USER2 package, 
$v_Y = "U2_VALUE_X"; 
# use MACRO_SPEC 
my $USER2 = (
    u2key1 => "u2value1", 
    u2macrokey => $MACRO_SPEC, # need macro to interpolate 'local' $v_Y 
); 


#this is how USER1 should look after the interpolation 
my $USER1 = (
    u1key1 => "u1value1", 
    u1macrokey => { 
        mkeyX => "value_X", 
        mkeyY => "U1_VALUE_X" 
       }, 
); 
#this is how USER2 should look after the interpolation 
my $USER2 = (
    u2key1 => "u2value1", 
    u1macrokey => { 
        mkeyX => "value_X", 
        mkeyY => "U2_VALUE_X" 
       }, 
); 
+0

「マクロ」を機能化してみませんか? – melpomene

+0

あなたは '$ USER1'と' $ USER2'を後で見えるようにしてください。あなたはあなたの質問を編集することができます。また、中括弧 '{}'の代わりにかっこ '()'を使って定義していることに注意してください。間違っています。 – simbabque

答えて

3

は、あなたが$MACRO_SPECは、それが呼び出されるたびに異なる何かを生成できる機能になりたい、提案しました。

package One; 
our $v_Y; 
my $MACRO_SPEC = sub { +{ mkeyX => "value_X", mkeyY => $v_Y } }; 

... 

package USER1; 
$One::v_Y = "U1_VALUE_X"; 
my $user1 = {   # { }, not (), to define a hash reference 
    u1key1 => "u1value1", 
    u1macrokey => $MACRO_SPEC->(), # $f->() to exec code defined in $f 
    ... 
}; 
+0

これが機能しました。ありがとう。 – RaviK

関連する問題