【发布时间】:2012-11-15 17:58:43
【问题描述】:
我有一个 Perl 散列散列......大约 11 或 12 个元素深。请原谅我没有重复下面的结构!
有些关卡有固定的标签,例如'NAMES'、'AGES' 或类似的,所以访问这些级别很好,因为我可以直接使用标签,但我需要遍历其他变量,这会导致一些非常长的语句。这是一组循环中一半的示例:
foreach my $person (sort keys %$people) {
foreach my $name (sort keys %{$people->{$person}{'NAMES'}}) {
foreach my $age (sort keys %{$people->{$person}{'NAMES'}{$name}{'AGES'}}) {
. . . # and so on until I get to the push @list,$element; part
这只是一个例子,但它遵循我的结构。没有固定名称部分(大写的元素)可能会更短,但在其他地方需要它们以供参考。
我尝试将元素转换为哈希以在每个阶段缩短它, 例如对于第二个 foreach,我尝试了各种形式:
foreach my $name (sort keys %{$person->{'NAMES'}})
但这没有用。我确定我以前见过类似的东西,所以语义可能不正确。
我研究了有关散列的散列和对散列及其元素的引用等页面,但没有运气。我见过while each 循环的示例,但它们似乎并不是特别短或更容易实现。也许只有一种不同的方法可以做到这一点,我没有抓住重点。我已经写出了完整的foreach 循环集,如果我不必再重复六次左右,那就太好了。
当然,可能没有“简单”的方法,但感谢所有帮助!
【问题讨论】:
-
听起来您的代码将受益于不同的数据模型。我很难想象对应于 11 或 12 级哈希的真实情况。例如,即使一个人有多个名字,他们肯定不应该有多个年龄吗?所以
AGE应该只是个人级别的另一个哈希键。也许使用 Perl 的面向对象功能会有所帮助:broadcast.oreilly.com/2008/11/…。 -
@WinnieNicklaus,XML 通常有 12 层深的节点。
-
这只是一个示例数据集,它实际上并不与人相关,但我用它只是为了显示代码的结构。数据对应于数据库的一部分,指的是一组在早期最好减少的id,否则会导致程序在以后变慢。它冗长乏味,但适用于它所代表的:)
-
这使得想出正确的变量名变得不可能。你能给出一些有意义的东西吗?
-
国家->县->城市->街道->房屋->人(姓名,年龄)
标签: perl hash-of-hashes