如何创建哈希的递归哈希?(无限深)

Ant*_*ine 4 perl data-structures

拜托,我尝试创建一个复杂的数据结构。我知道该怎么做

$branch{'level1'}{'level2'}{'level3'}='leaf';
Run Code Online (Sandbox Code Playgroud)

但我不知道如何创建

$branch{'level1'}....{'levelN'}='leaf';
Run Code Online (Sandbox Code Playgroud)

我尝试这样的事情:

$branch{'leaf'} = "1";
$branchREF = \%branch;
$branchtmp{'level3'} = $branchREF;
Run Code Online (Sandbox Code Playgroud)

所以我成功地得到:

$VAR1 = 'level3';
$VAR2 = {
          'leaf' => '1'
        };
Run Code Online (Sandbox Code Playgroud)

但是对于下一步,要对哈希进行递归 N 哈希,我尝试:

%branch = %branchtmp;
Run Code Online (Sandbox Code Playgroud)

但结果完全错误......%branch不是我所期望的。要进行递归,我需要重用我的第一个%branch而不是创建一个新的。请问我该怎么办?

一种。

ike*_*ami 5

我强烈建议使用现有的解决方案,例如Data::Diver

use Data::Diver qw( DiveVal );

my @keys = map "level$_", 1 .. 3;

my $branch = {};
DiveVal($branch, map \$_, @keys) = 'leaf';
  -or-
my %branch;
DiveVal(\%branch, map \$_, @keys) = 'leaf';
Run Code Online (Sandbox Code Playgroud)

显然,它也可以在没有模块的情况下完成。

sub DiveVal :lvalue {
   my $p = \shift;
   $p = \( $$p->{$_} ) for @_;
   $$p
}

my @keys = map "level$_", 1 .. 3;

my $branch;
DiveVal($branch, @keys) = 'leaf';
  -or-
my %branch;
DiveVal(\%branch, @keys) = 'leaf';
Run Code Online (Sandbox Code Playgroud)

我的DiveVal工作方式:

use Data::Diver qw( DiveVal );

my @keys = map "level$_", 1 .. 3;

my $branch = {};
DiveVal($branch, map \$_, @keys) = 'leaf';
  -or-
my %branch;
DiveVal(\%branch, map \$_, @keys) = 'leaf';
Run Code Online (Sandbox Code Playgroud)

额外的间接级别有很多好处。

  • 它消除了对最后一个键进行特殊处理的需要。
  • 它消除了在取消引用之前创建哈希的需要。
  • 它消除了将根作为对哈希的引用的需要。相反,任何标量都可以是根,甚至是未定义的。
  • 它可以轻松扩展DiveVal以支持混合数组/哈希结构。