0

複雑な構造のハッシュがあり、検索と置換を実行したいと考えています。最初のハッシュは次のようになります。

$VAR1 = {
  abc => { 123 => ["xx", "yy", "zy"], 456 => ["ab", "cd", "ef"] },
  def => { 659 => ["wx", "yg", "kl"], 456 => ["as", "sd", "df"] },
  mno => { 987 => ["lk", "dm", "sd"] },
}

そして、すべての '123'/'456' 要素を繰り返し検索したいのですが、一致が見つかった場合は、サブレイヤーの比較を行う必要があり['ab','cd','ef']ます['as','sd','df']。 ','cd','ef']. したがって、出力は次のようになります。

$VAR1 = {
  abc => { 123 => ["xx", "yy", "zy"], 456 => ["ab", "cd", "ef"] },
  def => { 659 => ["wx", "yg", "kl"] },
  mno => { 987 => ["lk", "dm", "sd"] },
}

したがって、削除はインデックスではなく、サブ構造に基づいています。どうすればそれができますか?助けてくれてありがとう!!

保持する値を宣言するとします。つまり、事前に宣言された ["ab", "cd", " ef"] 他の場所で 456 の他のインスタンスを削除します。検索はすべてのキーに対して行う必要があります。そのため、コードはハッシュを調べ、最初に 123 => ["xx", "yy", "zy"] を取得し、残りのハッシュ全体でそれをキーと比較します。一致が見つからない場合は何もしません。456 => ["ab", "cd", "ef"] の場合のように一致が見つかった場合、2 つが比較されます。 ab", "cd", "ef"] は保持され、保持されます 456 => ["ab", "cd", "ef"

4

1 に答える 1

0

これは、スマート マッチ演算子を使用して配列比較を実行するソリューションです。

更新:ボロディンが指摘したように、私の元のコードは間違っていました。これは修正版です。

更新 2:ハッシュ構造に基づいて保持する値を選択するように変更しました。

my $VAR1 = {
  abc => { 123 => ["xx", "yy", "zy"], 456 => ["ab", "cd", "ef"] },
  def => { 659 => ["wx", "yg", "kl"], 456 => ["as", "sd", "df"] },
  mno => { 987 => ["lk", "dm", "sd"] },
};

my %keep_values = (
    '456' => ['ab','cd','ef']
);

foreach my $outer_key (keys %$VAR1)
{
    foreach my $keepers (keys %keep_values)
    {
        if (exists $VAR1->{$outer_key}{$keepers} and 
            #use the smart match operator to compare arrays.
            !(@{$VAR1->{$outer_key}{$keepers}} ~~ @{$keep_values{$keepers}}))
        {
            delete $VAR1->{$outer_key}{$keepers};
        }
    }   
}

スマート マッチ演算子の詳細については、perlopを参照してください。

于 2012-10-01T14:00:06.233 に答える