2012-02-14 75 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