【问题标题】:in perl ,how to use variable value as hash element在 perl 中,如何使用变量值作为哈希元素
【发布时间】:2012-02-14 19:09:17
【问题描述】:

我是 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"} ;
}

但它似乎不起作用,我知道${$_} 部分是错误的,谁能告诉我怎么做 解决这个问题?

【问题讨论】:

  • 不要那样做。要么将对散列的引用放入一个数组并对其进行循环,要么(如果名称很重要)将它们放入一个散列中并使用数组中的值作为键名(或者如果顺序不是,则只循环外部散列' t 重要)。

标签: perl variables hash


【解决方案1】:

使用嵌套哈希。像这样:

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。

【讨论】:

    【解决方案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};
    }
    

    【讨论】:

    • 非常感谢你这么详细的回答,“哈希数组”真的帮助了我。我把哈希的引用放在一个数组中,再次非常感谢你的帮助
    【解决方案3】:

    您可以为此使用 eval。

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

    【讨论】:

    • 这行得通,但为什么呢?可以给我解释一下吗,非常感谢
    • 引号中的字符串在循环的迭代中扩展为%var = %op1_sel 或%var = %op2_sel。 eval 将其作为 perl 脚本执行,因此 %var 填充有哈希值。然后就可以使用新变量了。
    • 这可能会正确回答问题,但我建议不要实际使用这样的代码。通常不鼓励使用eval,尤其是在另一个变量中通过变量名引用变量(尽管在非常特殊的情况下可能是合适的)。 Aspirinnnnn:我希望你学到了一点,但是当你遇到类似的实际问题时,请坚持Perl references。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 2015-03-26
    • 2014-04-13
    • 1970-01-01
    • 2013-08-26
    相关资源
    最近更新 更多