使用表示散列结构的字符串访问散列引用数据

sen*_*nel 2 perl hash

假设我有一个复杂的哈希引用$ hash_ref,我想通过这样做来访问它中的数据:

my $string1 = "{books}";
my $string2 = "{31335}->{book_name}";
print Dumper($hash_ref->$string1->$string2);
Run Code Online (Sandbox Code Playgroud)

当然,这不起作用,但我希望它能解释我想做什么.

显然,我可以通过很多方式来完成这项工作,但我(出于好奇心)真的有兴趣弄清楚是否有一些Perl魔法可以使这个工作没有分裂字符串等.

我知道我可以创建3个字符串,("books", "31335", "book_name")并在一秒钟内完成,并且肯定有其他方法,但我从未理解是否可以通过使用表示散列结构的字符串实际访问散列数据,如上例所示.

谢谢 :)

FMc*_*FMc 6

它可以使用eval.但是,仅仅因为有些可以做到并不意味着它应该.

use strict;
use warnings;

my $hr = { books => { 31335 => { book_name => 'FOO' } } };

my $k1 = "{books}";
my $k2 = "{31335}->{book_name}";

my $f = eval "\$hr->$k1->$k2";  # Don't do this. It's a terrible idea.
print $f, "\n";                 # FOO
Run Code Online (Sandbox Code Playgroud)

你应该咬紧牙关并从字符串中提取密钥:

my @ks = "$k1$k2" =~ /\{ \s* (.+?) \s* \}/gx;
$f = $hr;
$f = $f->{$_} for @ks;
print $f, "\n";                 # FOO
Run Code Online (Sandbox Code Playgroud)