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
而不是创建一个新的。请问我该怎么办?
一种。
我强烈建议使用现有的解决方案,例如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
以支持混合数组/哈希结构。