0

深くネストされた構造のハッシュがあります。ネスティングのレベルは事前にわかりません。ただし、各レベルには、「インスタンス」という 2 つのプロパティと、「依存関係」の別のハッシュがあります。したがって、これは一種の再帰的なハッシュです。

my $HASH = {
    "top"=> {
        "instance" => "top_instance",
        "dependencies" => {
            "sub_block1" => {
                "instance" => "sub_block1_instance",
                "dependencies" => {}
            },
            "sub_block2" => {
                "instance" => "sub_block2_instance",
                "dependencies" => {
                    "sub_block3" => {
                        "instance" => "sub_block3_instance",
                        "dependencies" => {}
                    }
                }
            }
        }
    }
};

ユーザー定義の文字列を受け取り、指定された階層レベルからハッシュの内部部分を返すサブルーチンがあります。

たとえば、ユーザーが「sub_block2」を指定した場合、サブルーチンは次のハッシュを返す必要があります。

{
    "sub_block2" => {
        "instance" => "sub_block2_instance",
        "dependencies" => {
            "sub_block3" => {
                "instance" => "sub_block3_instance",
                "dependencies" => {}
            }
        }
    }
}

これは私のサブルーチンです:

sub get_starting_point {
    my $string = shift;
    my $config = shift;
    foreach my $key (keys %$config) {
        if($key ne $string) {
            # if current key is not what user asked for, recurse into next level of hierarchy
            if (exists $$config{$key}{dependencies}) {
                &get_starting_point($$config{$key}{dependencies});
            }
        } else {
            # we found the key, return the hash under this hierarchy
            my $tempHash = {$key => $$config{$key}};
            print ref($tempHash); # correctly prints HASH
            print Dumper($tempHash); # correctly prints out the sub-hash
            return $tempHash; # I am expecting this return value to be a hash-ref
        }
    }
}

ご覧のとおり、これは再帰関数であり、引数に一致するキーにヒットし、そのキーの下の完全なサブハッシュを返すまで、ハッシュを深く掘り下げ続けます。

これが、このサブルーチンを呼び出す方法です。

my $subHash = get_starting_point("sub_block2",$HASH);
print ref($subHash); # is not a ref
print Dumper($subHash); # prints nothing

私は何を間違っていますか!?!?

編集:私の正確な問題で質問を更新しました。以前に使用した簡単な例が期待どおりに機能したようです。

4

2 に答える 2