arrays - 在 Perl 中遍历数组的哈希数组?
问题描述
我在可视化循环时遇到了麻烦,并且我认为是数组的散列数组。如果我对此有误解,请纠正我。我希望能够遍历下面的数组并打印每个键的值。
最终结果将像这样打印元素:
name
version
pop
tart
不幸的是,当我到达关键三时,我崩溃了。
my @complex = (
[
{
one => 'name',
two => 'version',
three => [qw( pop tart )],
},
],
);
这是我到目前为止所管理的。我只是不知道在这些循环中处理关键三。
for my $aref (@complex) {
for my $href (@$aref) {
for (keys %{$href}) {
print "$href->{$_}\n";
}
}
}
任何帮助,将不胜感激。
解决方案
似乎阻碍你的是你的哈希有一些值是字符串和一些是数组引用。您可以找出哪些是使用ref然后相应地打印
for my $aref (@complex) {
for my $href (@$aref) {
for my $key (keys %{$href}) {
my $refval = ref $href->{$key};
if (not $refval) { # not a reference at all
print "$href->{$key}\n";
} elsif ($refval eq 'ARRAY') {
print "$_\n" for @{ $href->{$key} };
#print "@{ $href->{$key} }\n"; # or all in one line
} else {
warn "Unexpected data structure: $refval";
}
}
}
}
对于更深的结构,或者你不知道的结构,在此基础上编写一个递归过程。还有一些模块可以做到这一点。
请注意,仔细考虑要使用哪些数据结构会带来丰厚的回报;它是设计的关键部分之一。另一方面,一旦这些复杂的数据结构变得笨拙,或者更确切地说,如果您提前估计在项目的生命周期中可能会发生这种情况,答案就是切换到一个类。
推荐阅读
- delphi - 当还没有添加子节点时,有没有办法显示 TTreeNode 的 > 符号?
- asp.net - 使用c#替换byte [] pdf文件中的字符串
- c# - 如何在 C# 中通过 lambda 查询获取最大值?
- c# - IndexOf 在 c# 中不返回任何值
- java - AWS Lambda 构造函数重载 Java POJO
- ios - 快速在具有动态宽度的 UIView 中添加 UIButton
- html - bootstrap 4.1 移动菜单按钮不起作用
- c++ - std::vector erase() 没有按预期工作
- java - 如何使用 Java Optional 优雅地替换三元运算符
- azure-devops - Azure DevOps 分支策略路径筛选器,用于检测项目根文件夹中的更改