You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 22:33:22