perl - Perl grep 命令用于嵌套哈希而不是使用循环
问题描述
我有以下哈希结构。
$VAR1 = {
'USA' => {
'Alabama' => {
'ISO3' => 'ISO3:3166-2:US',
'ISO2' => 'ISO2:4166-23:US',
'UNI' => 'UNIABR-A',
'UNDP' => 'UNDP-ZXC-1',
'FAOSTAT' => 'STAT20.98',
'GAUL' => 'UL-SD-20/40'
},
'Washington' => {
'ISO3' => 'ISO3:40-166-2:US',
'ISO2' => 'ISO2:30-23:US',
'UNI' => 'UNIISO-B',
'UNDP' => 'UNDP-YXC-2',
'FAOSTAT' => 'STAT30.98.78',
'GAUL' => 'UL-SD-30/60'
}
}
};
我想要实现的是遍历上述哈希并获取哈希“ISO2:4166-23:US”中值的州名和国家名称。我试图做的是:
我可以使用以下代码获得所需的输出。
my $find = "ISO2:4166-23:US";
my $statename;
while ( my ($country, $states) = each (%$VAR1) ) {
while (my ($states, $otherkeys) = each (%$states) ) {
while (my ($otherkeys, $value) = each %$otherkeys) {
$statename = $states if ($value eq $find);
}
}
}
print "State name for value [$find] is :: $statename \n"; ### Output : Alabama
有什么办法可以得到-
如果等于 ,则获取top-level key
“USA”和second-level key
“Alabama” 。我所知道的是我需要获取输出的哈希值,与我的搜索值对应的键无关紧要。$value
ISO2:4166-23:US
使用来自上述哈希的单行 grep 命令?
任何指向正确方向的指针都会很有用。谢谢。
解决方案
不,哈希是单向的,因此您必须遍历所有值才能找到您要搜索的值。
听起来您真正想要的是某种数据库,而哈希对于您的工作来说是错误的工具。
您可以使用作为键的另一种方式构建您的哈希ISO2
,例如
$VAR1 = {
"ISO2:4166-23:US" => { Country => 'USA', State => 'Alabama' },
"ISO2:4166-23:US" => { Country => 'USA', State => 'Washington' }
}
如果您打算经常进行这些查找,那么这可能是值得的。这样做也可以自动化。使用类似的循环来构建一个新的散列以用作查找。
在速度方面,循环遍历所有哈希键没有任何问题。直接查找和循环之间的区别可以忽略不计,除非你有一个真正巨大的散列。
推荐阅读
- bash - Bash 参数扩展无法匹配 $* 和 $@ 等变量中的空格
- python - pytype 为(显然)有效的类方法返回 bad-concrete-type
- node.js - 尝试用mongose和graphql实现编号页类型的分页数据
- scala - 在 prod 期间调用 Actor 内的 Sink,但在测试期间不调用
- c# - Having Multiple Step Files Opens Multiple Browsers
- javascript - 图像路径和删除属性不起作用?
- c++ - 用于容器适配器的 C++ back_insert_iterator
- go - Calling a function on element of struct which is a nil pointer
- node.js - How to send headers after loop
- python - AttributeError:“str”对象没有来自用户输入的属性“copy”