我需要在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?
$p每次都没有被"重置"; 它被设置为哈希中的下一个较低级别,刚刚添加.此时它只是一个空的hashref,{}因为它将在下一个循环迭代中填充.
我不知道你是如何得出结论,$p是一个新的变量每一次,但这是不正确..它只是指着一个新的位置%hash的结构.由于它是在循环之外声明的,因此循环迭代时它不会丢失它的值.