3

我有一个部分嵌套的哈希,如下所示:

$href = {one=>1, word_counts=>{"the"=>34, "train"=>4} };

我想得到$href->{'word_counts'}{'train'}. 是否可以将 放入{'word_counts'}{'train'}变量中,所以我可以通过简单地调用来访问它$href->$variable

4

3 回答 3

6

不,但您可以使用 Data::Diver 获取给定键列表的值:

my @keys = ('word_counts', 'train');
my $value = Data::Diver::Dive($href, \(@keys));
于 2020-07-11T00:48:11.253 回答
3

有多种方法可以做到这一点。我认为$href一旦你有一条通往你想要的价值的捷径,你就不需要参与进来。

您可以引用该值,但必须取消引用它:

my $value_ref = \ $href->{'word_counts'}{'train'};
say $$value_ref;

有一个实验refaliasing功能,双方都是参考。现在您不需要取消引用:

use v5.22;
\ my $value_ref = \ $href->{'word_counts'}{'train'};
say $value_ref; # 4
$value_ref = 17;
say $href->{'word_counts'}{'train'};  # 17

自己走散列并不难。诀窍是获取一个散列级别,将其存储在一个变量中,然后使用该变量获取下一个级别。继续前进,直到你到达你想去的地方:

my $href = {
    one => 1,
    word_counts => {
        "the" => {
            "dog" => 45,
            "cat" => 24,
            },
        "train" => {
            "car" => 7,
            "wreck" => 37,
            }
        }
    };

my @keys = qw( word_counts train car );

my $temp = $href;
foreach my $key ( @keys ) {
    die "Not a hash ref at <$key>" unless ref $temp eq ref {};
    die "<$key> not in the hash" unless exists $temp->{$key};
    $temp = $temp->{$key};
    }

print "Value is <$temp>";  # 7
于 2020-07-11T09:59:25.910 回答
1

除了来自 ysth 和 brian d foy 的更一般、出色的答案之外,还可以考虑一个非常简单(也许太简单)的解决方案:

my @keys = qw( word_counts train);
print $href->{ $keys[0] }{ $keys[1] }; # 4

请注意,此解决方案是重复的,不优雅(键的顺序是硬编码的),并且不会尝试遍历散列。但是根据上下文和 OP 的具体任务,这可能就是所需要的。

于 2020-07-13T16:45:44.753 回答