在perl中,如何使用变量值作为哈希元素

时间:2012-02-14 08:46:34

标签: perl variables hash

我是Perl的新手,在Learning 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"} ;
}

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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};
}

答案 2 :(得分:1)

您可以使用eval。

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