ike*_*uru 4 perl hashtable key-value autovivification
我正在迭代一个纬度键散列的缓存,指向经度/城市的键/值对.我试图找到纬度/经度的近似匹配,这些匹配足够接近已经查找过的并且在散列中.
我是这样做的
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;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
该代码用于在该范围内找到这些lat/lon对.然而,对于每个纬度,它通过使用循环,当它确实发现它在范围内(第一个嵌套条件)时,它将它添加到哈希(大概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' => {},
...
Run Code Online (Sandbox Code Playgroud)
这种查找的聪明或至少是理智的方法是什么?所以我不是无意中通过查找它们来添加哈希键?
你所经历的是自动生存.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);
Run Code Online (Sandbox Code Playgroud)
有几种方法可以避免这种情况 -
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;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
134 次 |
| 最近记录: |