Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在perl中将局部变量合并到全局哈希中_Perl_Perl Module - Fatal编程技术网

在perl中将局部变量合并到全局哈希中

在perl中将局部变量合并到全局哈希中,perl,perl-module,Perl,Perl Module,我需要在多个用户哈希中合并一个通用哈希(宏)。实际上,这些规范在perl中都是以HoH/HoL形式编写的 我希望“用户”规范采用宏规范,并进行自己的修改。在下面的示例中,变量“$v_Y”需要在user1和user2中具有不同的值 我下面所说的并不是确切的代码,而是试图说明这个问题。我不能有多个$v_Y值,因为已经创建了宏规范 ## this is in a package my $MACRO_SPEC = { mkeyX => "value_X", mkeyY =>

我需要在多个用户哈希中合并一个通用哈希(宏)。实际上,这些规范在perl中都是以HoH/HoL形式编写的

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

我下面所说的并不是确切的代码,而是试图说明这个问题。我不能有多个$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"
                },
);

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

为什么不把你的“宏”变成一个函数呢?你能把
$USER1
$USER2
之后应该是什么样子吗?你可以回答你的问题。还要注意,您使用括号
()
而不是花括号
{}
来定义这些,这是错误的。