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

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;
}

关键修改说明

  1. 数组引用解包:用@{$decoded->{'subdomains'}}将数组引用转换为普通数组,这样就能遍历或拼接里面的子域名元素。
  2. 错误检查增强:增加了请求成功判断和subdomains字段的有效性校验,避免脚本因API返回异常直接崩溃。
  3. 代码精简:移除了你没用到的模块(比如HTTP::Request、Data::Dumper)和重复创建的LWP::UserAgent实例,让脚本更简洁高效。

运行这个修改后的脚本,你就能看到清晰的子域名列表,而不是奇怪的数组内存地址啦。

内容的提问来源于stack exchange,提问作者zétfe egeèe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:57:05