2017-07-19 17 views
1

私の要件は以下の通りです。だから、Perl同じハッシュ内のハッシュ値へのハッシュ参照

my %test; 

$test{map}{a} = 32; 
$test{map}{b} = $test{map}{a}+10; 
$test{ref}{r} = $test{map}{b}; 

、私は 印刷ダンパを行う(\%試験)以下のように同じハッシュの中にキーの値は、他のキーの値に依存しています。

$VAR1 = { 
      'ref' => { 
        'r' => 52 
        }, 
      'map' => { 
        'a' => 42, 
        'b' => 52 
        } 
     }; 
以下のように私は、ハッシュ値を変更した場合 私は、私が代わりに

$VAR1 = { 
      'ref' => { 
        'r' => 42 
        }, 
      'map' => { 
        'a' => 42, 
        'b' => 42 
        } 
     }; 

取得

$test{map}{a} = 42 

$VAR1 = { 
      'ref' => { 
        'r' => 42 
        }, 
      'map' => { 
        'a' => 32, 
        'b' => 42 
        } 
     }; 

を取得し、私は更新され、ハッシュ%のテストを持っている必要があります

どのように上記の結果を達成する?どんな助けも大いにありがたいです。

+0

ありがとうございますlarsen&Apoorv Joshi。あなたが提供した解決策は、私が望むようにコードを実装するのに役立ちました。 – Ajatasatru

答えて

1

あなたが書いたコードの意味はあなたが想像したものではありません。特に:

$test{map}{b} = $test{map}{a}+10; 
$test{ref}{r} = $test{map}{b}; 

これらない -asは、私はあなたが$test{map}{b}$test{map}{b}誰かがそれらを読み込むたびの値を取得するために、「ルール」をimagined-と思いますが、説明書に関連付けられている値を変更し、実行時ということですキーbおよびr。以上です。

ハッシュの要素を動的にするには、サブルーチンへの参照と、ユーザーが値を要求したときにこれらの規則を評価するメカニズムを使用する方法があります。しかし、複雑になる可能性があることを忠告してください:例えば循環参照はどうですか?あなたの例ではrというキーのように、他のルールを参照するルールですか?

とにかく、ここではコンセプトの証明としていくつかのコード:

use strict; 
use warnings; 
use v5.10; 

my %test; 

$test{map}{a} = 32; 
$test{map}{b} = sub { evaluate($test{map}{a}) + 10 }; 
$test{ref}{r} = sub { evaluate($test{map}{b}) }; 

sub evaluate { 
    my $expr = shift; 
    if (ref $expr eq 'CODE') { 
    # We need to execute the procedure indicated 
    # to obtain a value 
    return $expr->(); 
    } 
    else { 
    # Otherwise, we just return what we found associated to the key 
    return $expr; 
    } 
} 

say evaluate($test{ map }{ a }); # 32 
say evaluate($test{ map }{ b }); # 42 
say evaluate($test{ ref }{ r }); # 42 

$test{map}{a} = 42; 

say evaluate($test{ map }{ a }); # 42 
say evaluate($test{ map }{ b }); # 52 
say evaluate($test{ ref }{ r }); # 52 

はここでも、一般的な固体ソリューションを開発することは決して些細なプロジェクトです。あなたがPerlの観点からこれらのテクニックに興味があるなら、非常に良い本はHigher Order Perlで、オンラインでも無料で入手できます。

0

あなたができることは、値を割り当てる代わりに、サブルーチンを割り当てます。例:

my %test; 

$test{map}{a} = 32; 
$test{map}{b} = sub { return $test{map}{a}+10; }; 
$test{ref}{r} = sub { return $test{map}{b}(); }; 

print $test{ref}{r}() . "\n"; 

$test{map}{a} = 42; 

print $test{ref}{r}() . "\n"; 
関連する問題