2012-02-14 6 views
1

私はPerlを使い慣れていないので、Perlの学習ブックでその質問の答えを見つけることができません。in perl、可変値をハッシュ要素として使用する方法

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

と2つのハッシュテーブルのように:

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

は、今私は、特定のハッシュテーブルのためのループにループ内で変数を使用したい

は、例えば私のような配列を持っています キー例えば:

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

しかし、それは動作していないようだ、私はを知っています部分が間違っている、誰でも私にどのように教えてくれますか? これを修正するには?

+2

はそれをしないでください。ハッシュへの参照を配列に入れ、その上にループするか、(名前が重要な場合)ハッシュに入れ、配列の値をキー名として使用します(または、順序が '重要です)。 – Quentin

答えて

2

$ {$ foo}構文を使用して、字句(my)変数を参照することはできません。パッケージ変数の場合はおそらくそれを動作させることができますが、これは正しい方法ではありません。

これを行う正しい方法は、ネストされたデータ構造を使用することです。

私はそれを行う2つの明白な方法を見ることができます。あなたは、内側のハッシュを直接含む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

"ハッシュの配列"は本当に助けになりました。ハッシュの配列を配列に入れました。もう一度あなたの助けに感謝します。 – JIE

1

これにevalを使用できます。

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

これは機能しましたが、なぜですか?あなたにそれを私に説明してもらえますか?ありがとうございます – JIE

+0

引用符で囲まれた文字列は、サイクルの反復で '%var =%op1_sel'または'%var =%op2_sel'のように展開されます。 'eval'はそれをperlスクリプトとして実行するので、'%var'にはハッシュが設定されます。次に、新しい変数を使用することができます。 – core1024

+12

これは問題に正しく答えるかもしれませんが、実際にはこのようなコードを使用しないことをお勧めします。 'eval'を使うこと、特に別の変数で変数を変数名で参照することは、一般的には避けてください。 Aspirinnnnn:あなたが少し学んだことを願っていますが、これに似た実際の問題があるときは、[Perlの参考文献](http://perldoc.perl.org/perlreftut.html)に固執してください。 –

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も参照してください。

関連する問題