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

标签 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};
}

我的问题是它如何工作以及为什么工作。我以为我知道 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/

相关文章:

perl - 如何检查Perl中的几个变量是否为空

perl - 使用 Test::More 在 perl 中进行单元和集成测试 - 如何捕获退出调用?

Perl libXML 按属性值查找节点

linux - perl 中的空格错误

image - Perl GD每次都不画圆形,而是画一个矩形

jquery - 如何在pQuery中获取元素属性

Perl SV 值来自没有副本的指针

php - 具有服务器端脚本语言(php、perl、python、shell...)的 RSA-PSSR

linux - 如果文件不存在,如何创建它的完整路径?

perl - 为什么 Perl 的 Archive::Tar 内存不足?