【问题标题】:incorporating local variables in a global hash in perl在 perl 中将局部变量合并到全局哈希中
【发布时间】:2016-12-28 11:05:36
【问题描述】:

我需要在多个用户散列中合并一个通用散列(宏)。实际上,这些都是在 perl 中写成 HoH/HoL 的规范。

我希望“用户”规范采用带有自己修改的宏规范。在下面的示例中,变量“$v_Y”需要在 user1 和 user2 中具有不同的值。

我下面的内容并不完全是代码,而是试图说明问题。我无法拥有多个 $v_Y 值,因为已经创建了 macro_spec。

## 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"
                },
);

【问题讨论】:

  • 为什么不把你的“宏”变成一个函数呢?
  • 您能否包括$USER1$USER2 之后的样子?你可以edit你的问题。另请注意,您使用括号 () 而不是花括号 {} 来定义它们,这是错误的。

标签: perl perl-module


【解决方案1】:

就像 melpomene 建议的那样,您希望 $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
    ...
};

【讨论】:

    猜你喜欢
    • 2013-10-06
    • 1970-01-01
    • 2017-11-08
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多