2012-02-14 39 views
1

我是Perl新手,无法在Learning Perl书中找到问题的答案。perl,如何使用变量值作为散列元素

比如我有这样一个数组:

my @loop=("op1_sel","op2_sel"); 

和两个哈希表:

my %op1_sel=(
     "bibuf","000", 
     "self","101" 
      ); 
my %op2_sel=(
     "zero","1", 
     "temp","0" 
      ); 

现在我想用变量的循环来进行哈希表特定例如关键 :

foreach(@loop) 
{ 
    print ${$_}{"bibuf"} ; 
} 

,但它似乎不工作,我知道${$_}部分是错误的,任何人都可以告诉我如何解决这个问题 ?

+2

不要那样做。将哈希引用放到数组中并循环,或者(如果名字很重要)将它们放入哈希中,并将数组中的值用作关键字名称(如果顺序不正确,则循环使用外部哈希) t重要)。 – Quentin 2012-02-14 09:20:07

回答

2

您不能使用$ {$ foo}语法引用词法变量(my)变量。如果它们是包变量,你可能可以使它工作,但这不是正确的解决方法。

正确的做法是使用嵌套数据结构。

我可以看到两种明显的做法。你可以直接创建一个包含内部哈希的op_sel数组,或者创建一个散列哈希,然后将其编入索引。

如此 “的散列数组”:

my @op_sels = (
    { 
     bibuf => '000', 
     self => '101', 
    }, 
    { 
     zero => '1', 
     temp => '0', 
    }, 
); 

for my $op (@op_sels) { 
    print $$op{bibuf}; 
} 

和 “哈希散列”:

my %op_sels = (
    1 => { 
     bibuf => '000', 
     self => '101', 
    }, 
    2 => { 
     zero => '1', 
     temp => '0', 
    }, 
); 

for my $op_key (sort keys %op_sels) { 
    print $op_sels{$op_key}{bibuf}; 
} 
+0

非常感谢你回答这么多的细节,“哈希数组”真的帮助我.i把哈希引用到数组中,再次非常感谢您的帮助 – JIE 2012-02-15 01:50:01

1

您可以使用eval来做到这一点。

foreach(@loop) 
{ 
     eval "\%var = \%$_"; 
     print $var{"bibuf"} ; 
} 
+0

这个工作,但为什么?你能解释一下吗,非常感谢 – JIE 2012-02-14 09:06:19

+0

引号中的字符串在周期的迭代中像'%var =%op1_sel'或'%var =%op2_sel'一样展开。 'eval'将它作为perl脚本执行,所以'%var'被填充了散列。然后你可以使用新的变量。 – core1024 2012-02-14 09:10:07

+12

这可能会正确回答问题,但我建议不要使用这样的代码。通常不鼓励使用'eval',特别是在别的变量中通过名称引用变量(尽管非常特殊的情况下可能适用)。 Aspirinnnnn:我希望你已经学会了一点,但是当你遇到与此相似的实际问题时,请坚持[Perl引用](http://perldoc.perl.org/perlreftut.html)。 – 2012-02-14 09:10:46

5

使用嵌套散列。就像这样:

my %op; 
# put a hash reference into hash, twice 
$op{op1_sel} = \%op1_sel; 
$op{op2_sel} = \%op2_sel; 

# later ... 
foreach (keys %op) { 
    print "bibuf of $_: $op{$_}->{bibuf}\n"; 
}; 

或者,长话短说,只是

my %op = (
    op1_sel => { 
     foo => 1, 
     bar => 2, 
     # ... 
    }, 
    op2_sel => { 
     # ... 
    }, 
}; 

{}结构创建匿名散列的引用,是处理嵌套数据结构的标准方法。请参阅perldoc perldsc