Perl调用JSON格式API获取子域名时输出数组引用问题求助
解决Perl脚本输出数组引用而非子域名列表的问题
嘿,我一眼就看出问题所在了——你直接打印$decoded->{'subdomains'}会输出ARRAY(0x625c868)这类内容,是因为ThreatCrowd API返回的subdomains字段是一个数组引用,Perl里直接打印数组引用时,只会显示它的内存地址标识,而不是数组里的实际子域名元素。
问题根源拆解
decode_json解析API返回的JSON后,$decoded->{'subdomains'}指向的是一个数组的引用,而非数组本身。你需要把这个引用“解包”成可遍历的数组,才能输出里面的具体内容。
修正后的完整脚本
我帮你优化了脚本,去掉了冗余的模块导入和重复创建的UserAgent实例,同时添加了数组引用的处理逻辑和错误检查:
#!/usr/bin/perl use strict; use warnings; use LWP::UserAgent; use JSON qw(decode_json); # 只创建一次UserAgent实例,避免冗余 my $ua = LWP::UserAgent->new( keep_alive => 1, agent => "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.63 Safari/537.31" ); my $url = "https://www.threatcrowd.org/searchApi/v2/domain/report/?domain=fb.com"; my $response = $ua->get($url); # 先检查API请求是否成功 if ($response->is_success) { my $decoded = decode_json($response->content); # 确保subdomains字段存在且是数组引用 if (exists $decoded->{'subdomains'} && ref $decoded->{'subdomains'} eq 'ARRAY') { # 方法1:逐行打印每个子域名(推荐,可读性强) print "获取到的fb.com子域名列表:\n"; foreach my $subdomain (@{$decoded->{'subdomains'}}) { print "- $subdomain\n"; } # 方法2:用逗号拼接成一行输出(按需选择) # print "子域名:" . join(', ', @{$decoded->{'subdomains'}}) . "\n"; } else { print "未获取到有效子域名数据\n"; } } else { die "API请求失败:" . $response->status_line; }
关键修改说明
- 数组引用解包:用
@{$decoded->{'subdomains'}}将数组引用转换为普通数组,这样就能遍历或拼接里面的子域名元素。 - 错误检查增强:增加了请求成功判断和
subdomains字段的有效性校验,避免脚本因API返回异常直接崩溃。 - 代码精简:移除了你没用到的模块(比如
HTTP::Request、Data::Dumper)和重复创建的LWP::UserAgent实例,让脚本更简洁高效。
运行这个修改后的脚本,你就能看到清晰的子域名列表,而不是奇怪的数组内存地址啦。
内容的提问来源于stack exchange,提问作者zétfe egeèe
相关产品推荐
相关产品推荐

