我是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"} ;
}
但它似乎不起作用,我知道${$_}
部分是错误的,任何人都可以告诉我如何
解决这个问题?
答案 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 => {
# ...
},
};
{}
构造创建对匿名哈希的引用,是处理嵌套数据结构的标准方法。
答案 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"} ;
}