Perl 哈希引用 - 是否可以将对嵌套哈希的引用放入 1 个变量中?
Perl Hash References - Is it possible to put reference to nested hash into 1 variable?
我有一个部分嵌套的散列,如下所示:
$href = {one=>1, word_counts=>{"the"=>34, "train"=>4} };
我想得到 $href->{'word_counts'}{'train'}
的值。
是否可以将 {'word_counts'}{'train'}
放入变量中,这样我就可以通过简单地调用 $href->$variable
?
来访问它
否,但您可以使用 Data::Diver 获取给定键列表的值:
my @keys = ('word_counts', 'train');
my $value = Data::Diver::Dive($href, \(@keys));
有多种方法可以做到这一点。我不认为你需要参与 $href
一旦你有了通往你想要的价值的捷径。
您可以引用该值,但您必须取消引用它:
my $value_ref = \ $href->{'word_counts'}{'train'};
say $$value_ref;
有一个experimental refaliasing
feature,两边都是参考。现在你不需要取消引用:
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
除了来自 ysth 和 brian d foy 的更一般的优秀答案之外,还考虑一个非常简单(也许太简单)的解决方案:
my @keys = qw( word_counts train);
print $href->{ $keys[0] }{ $keys[1] }; # 4
请注意,此解决方案是重复的,不够优雅(键的顺序是硬编码的),并且不会尝试遍历哈希。但根据 OP 的上下文和具体任务,这可能就是所需要的。
我有一个部分嵌套的散列,如下所示:
$href = {one=>1, word_counts=>{"the"=>34, "train"=>4} };
我想得到 $href->{'word_counts'}{'train'}
的值。
是否可以将 {'word_counts'}{'train'}
放入变量中,这样我就可以通过简单地调用 $href->$variable
?
否,但您可以使用 Data::Diver 获取给定键列表的值:
my @keys = ('word_counts', 'train');
my $value = Data::Diver::Dive($href, \(@keys));
有多种方法可以做到这一点。我不认为你需要参与 $href
一旦你有了通往你想要的价值的捷径。
您可以引用该值,但您必须取消引用它:
my $value_ref = \ $href->{'word_counts'}{'train'};
say $$value_ref;
有一个experimental refaliasing
feature,两边都是参考。现在你不需要取消引用:
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
除了来自 ysth 和 brian d foy 的更一般的优秀答案之外,还考虑一个非常简单(也许太简单)的解决方案:
my @keys = qw( word_counts train);
print $href->{ $keys[0] }{ $keys[1] }; # 4
请注意,此解决方案是重复的,不够优雅(键的顺序是硬编码的),并且不会尝试遍历哈希。但根据 OP 的上下文和具体任务,这可能就是所需要的。