Perl开发中如何访问并使用匿名哈希存储的数据
Perl匿名哈希使用指南(适配你的whois查询开发场景)
你找到的这行代码只是初始化了一个空的匿名哈希引用:
## Instantiate a reference to an anonymous hash (key value pair) my $addr = {};
这行执行完的时候$addr里没有任何数据,后续业务逻辑肯定会往这个结构里填充IP地址、whois返回结果这类内容,你可以顺着这个变量往下找赋值逻辑,配合下面的语法就能拿到你要的数据。
- 匿名哈希引用的核心操作符是
->,和普通%hash的区别就是你拿到的$addr是指向哈希的引用,不是哈希本身,不能直接用$addr{key}的写法取值。
存值写法
不管是存单个字段还是嵌套的查询结果,都用箭头操作符按键名赋值:
# 存单个查询的基础字段 $addr->{query_ip} = '8.8.8.8'; $addr->{is_success} = 1; $addr->{raw_whois} = `whois 8.8.8.8`; # 批量存IP结果的话,直接把IP当键,对应whois解析结果当值(值本身也可以是匿名哈希) $addr->{'223.5.5.5'} = { net_name => 'ALIDNS', country => 'CN', registrant => 'Alibaba Cloud Computing Co., Ltd.' };
取值写法
知道键名的情况下直接用箭头取就行:
# 取单个字段 my $ip = $addr->{query_ip}; print "当前查询IP:$ip\n"; # 取嵌套的IP归属信息 my $ali_info = $addr->{'223.5.5.5'}; print "223.5.5.5运营主体:$ali_info->{registrant}\n";
不知道键名的时候调试方法
直接遍历整个哈希把所有内容打出来,就能看到里面到底存了什么字段:
# 遍历第一层键值对 for my $key (keys %$addr) { my $value = $addr->{$key}; print "键:$key | 值类型:" . ref($value) . " | 内容:"; # 如果值还是嵌套的哈希引用,就继续解引用遍历 if (ref($value) eq 'HASH') { print "\n"; while (my ($sub_k, $sub_v) = each %$value) { print " └ $sub_k : $sub_v\n"; } } else { print "$value\n"; } }
踩坑提示:如果操作的时候报“Not a HASH reference”类的错误,先检查你要访问的变量是不是真的是哈希引用,用
ref($addr)可以直接输出变量类型,返回HASH才是正确的哈希引用。
针对你当前的二次开发需求提两个实用点:
- 找到
$addr的赋值逻辑后,直接用上面的遍历方法打一次全量内容,10秒就能搞清楚里面存了哪些字段、结构是怎么嵌套的,不用逐行猜代码 - 批量读IP列表做whois查询的时候,直接用这个
$addr结构做结果去重:查询前先判断exists $addr->{$current_ip},已经查过的IP直接跳过,不用重复发whois请求
内容的提问来源于stack exchange,提问作者Koomba27
相关产品推荐
相关产品推荐

