我需要在 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};
}
我的问题是它如何工作以及为什么工作。我以为我知道 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);
}
然后取消注释行
#print Dumper($p)
每次都清楚地显示 $p 是一个新变量。
如果 $p 每次都被重置,\%hash 如何构建?
最佳答案
$p
并不是每次都被“重置”;它被设置为哈希中的下一个较低级别,即刚刚添加的级别。此时它只是一个空的哈希引用 {}
,因为它将在下一次循环迭代时被填充。
我不确定您是如何断定 $p
每次都是一个新变量,但这是不正确的。它只是指向 %hash< 中的一个新位置
结构。由于它是在循环外声明的,因此它不会在循环迭代时丢失其值。
关于perl - 在 perl 中构建可变深度哈希引用数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3302223/