在perl中构建可变深度哈希引用数据结构

ffl*_*r05 3 perl

我需要在perl中构建一个可变深度哈希数据结构.最终我发现了这段代码:


#!/usr/bin/perl -w
use strict;

my %hash;
my $value = "foo";
my @cats = qw(a b c d);

my $p = \%hash;
foreach my $item (@cats) {
 $p->{$item} = {} unless exists($p->{$item});
 $p = $p->{$item};
}
Run Code Online (Sandbox Code Playgroud)

我的问题是它的工作原理和原因.我以为我知道perl是如何工作的.在这段代码中,我没有看到\%hash值被重置,并且看起来每个循环都会重置$ p(这是一个局部变量).我甚至可以用数据转储器看到它:运行:


#!/usr/bin/perl
use warnings;
use strict;
use Data::Dumper;

my %hash;
my $value = "foo";
my @cats = qw(a b c d);

my $p = \%hash;
foreach my $item (@cats) {
 print "BEFORE:\n";
 print Dumper(\%hash);
 #print Dumper($p);
 $p->{$item} = {} unless exists($p->{$item});
 $p = $p->{$item};
 print "AFTER:\n";
 print Dumper(\%hash);
 #print Dumper($p);
}
Run Code Online (Sandbox Code Playgroud)

然后取消注释

#print Dumper($p)
Run Code Online (Sandbox Code Playgroud) 清楚地显示$ p每次都是一个新变量.

如果每次重置$ p,如何构建\%hash?

Eth*_*her 5

$p每次都没有被"重置"; 它被设置为哈希中的下一个较低级别,刚刚添加.此时它只是一个空的hashref,{}因为它将在下一个循环迭代中填充.

我不知道你是如何得出结论,$p是一个新的变量每一次,但这是不正确..它只是指着一个新的位置%hash的结构.由于它是在循环之外声明的,因此循环迭代时它不会丢失它的值.