gpt4 book ai didi

perl - 迭代时无意中将键添加到哈希

转载 作者:行者123 更新时间:2023-12-04 22:09:42 24 4
gpt4 key购买 nike

我正在遍历指向经度/城市的键/值对的纬度键散列的哈希缓存。我正在尝试为纬度/经度找到与已经查找的内容足够接近并且在散列中的近似匹配项。

我这样做

    foreach my $lat_key ( keys $lookup_cache_latlonhash ) {

if ( ($lat > ($lat_key - .5)) && ($lat < ($lat_key + .5)) ) {

foreach my $lon_key ( keys %{ $lookup_cache_latlonhash->{$lat_key}} ) {

if ( ($lon > ($lon_key - .5)) && ($lon < ($lon_key + .5)) ) {

$country = $$lookup_cache_latlonhash{$lat_key}{$lon_key};
print "Approx match found: $lat_key $lon_key $country\n";
return $country;
}
}
}
}

该代码用于在范围内找到这些纬度/经度对。然而,对于它循环使用的每个纬度,当它确实发现它在范围内(第一个嵌套条件)时,它将它添加到散列(可能是 keys %{ $goog_lookup_cache_latlonhash->{$lat_key}} )中,这不是有意的,向散列添加无用/空键:
$VAR1 = {
'37.59' => {},
'37.84' => {},
'37.86' => {},
'37.42' => {
'126.44' => 'South Korea/Jung-gu'
},
'37.92' => {},
'37.81' => {},
'38.06' => {
'-122.53' => 'America/Novato'
},
'37.8' => {},
'37.99' => {},
'37.61' => {},
...

进行此查找的聪明或至少是理智的方法是什么?所以我不会只是通过查找来无意中将键添加到散列中?

最佳答案

您遇到的是 auto-vivification 。 Perl 的一个特性是使使用嵌套结构更容易一些。

任何时候取消引用未定义的值,perl 都会自动创建您正在访问的对象。

use Data::Dumper; 
my $hash = {}; if ($hash->{'a'}) {} #No auto-vivification because you're just checking the value
keys %{$hash->{'b'}}; #auto-vivification because you're acting on the value (getting the keys of it) $hash->{b}
print Dumper($hash);

有几种方法可以避免这种情况 -
  • 在要避免这种情况的范围内添加 no autovivification功能
  • 检查您正在访问的项目是否已定义
    或存在(并且是您需要的类型)

  • 我推荐第二个,因为它有助于养成检查代码是否正确数据结构的习惯,并使调试更容易。
    foreach my $lat_key (keys $lookup_cache_latlonhash) {
    if (($lat > ($lat_key - .5))
    && ($lat < ($lat_key + .5))
    && ref($lookup_cache_latlonhash->{$lat_key}) eq 'HASH') #expecting a hash here - undefined or any non-hash value will skip the foreach
    {
    foreach my $lon_key (keys %{ $lookup_cache_latlonhash->{$lat_key}}) {
    if (($lon > ($lon_key - .5)) && ($lon < ($lon_key + .5))) {
    $country = $$lookup_cache_latlonhash{$lat_key}{$lon_key};
    print "Approx match found: $lat_key $lon_key $country\n";
    return $country;
    }
    }
    }
    }

    关于perl - 迭代时无意中将键添加到哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52324973/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com