首页 > 解决方案 > 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” 。我所知道的是我需要获取输出的哈希值,与我的搜索值对应的键无关紧要。$valueISO2:4166-23:US

使用来自上述哈希的单行 grep 命令?

任何指向正确方向的指针都会很有用。谢谢。

标签: perl

解决方案


不,哈希是单向的,因此您必须遍历所有值才能找到您要搜索的值。

听起来您真正想要的是某种数据库,而哈希对于您的工作来说是错误的工具。

您可以使用作为键的另一种方式构建您的哈希ISO2,例如

$VAR1 = { 
    "ISO2:4166-23:US" => { Country => 'USA', State => 'Alabama' },
    "ISO2:4166-23:US" => { Country => 'USA', State => 'Washington' }
}

如果您打算经常进行这些查找,那么这可能是值得的。这样做也可以自动化。使用类似的循环来构建一个新的散列以用作查找。

在速度方面,循环遍历所有哈希键没有任何问题。直接查找和循环之间的区别可以忽略不计,除非你有一个真正巨大的散列。


推荐阅读