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

如何在Perl中打印哈希引用键值?Nmap::Parser使用困惑

解决Nmap::Parser中scripts()哈希引用的访问问题

首先明确scripts()的两种调用逻辑:

  • 无参数调用:返回当前端口运行的所有NSE脚本名称列表(并非哈希结构)
  • 传入脚本名称参数:返回对应脚本的哈希引用,包含output和contents两个键

你的代码错误在于直接用标量接收无参数scripts()的返回值,并将其当作哈希引用遍历。正确的处理步骤如下:

正确代码示例

# 先获取当前端口的所有NSE脚本名称列表
my @script_names = $service->scripts();

foreach my $name (@script_names) {
    # 传入脚本名称,获取该脚本的哈希引用
    my $script_ref = $service->scripts($name);
    next unless defined $script_ref; # 跳过未运行成功的脚本

    # 访问output键对应的文本输出
    print "脚本[$name]的输出:\n", $script_ref->{output}, "\n";

    # 访问contents键对应的结构化数据(需根据实际结构调整遍历方式)
    print "脚本[$name]的结构化内容:\n";
    my $contents = $script_ref->{contents};
    if (ref $contents eq 'HASH') {
        foreach my $key (keys %$contents) {
            print "  $key => ", $contents->{$key}, "\n";
        }
    } elsif (ref $contents eq 'ARRAY') {
        foreach my $index (0..$#$contents) {
            print "  索引$index:", $contents->[$index], "\n";
        }
    }
}

关键说明

  1. 必须先通过无参数scripts()拿到所有脚本名称,再逐个传入参数获取对应哈希引用
  2. 务必判断$script_ref是否为undef,避免因访问未运行脚本引发错误
  3. contents是NSE脚本XML输出解析后的嵌套结构,可能是哈希或数组引用,需用ref判断类型后再遍历

内容的提问来源于stack exchange,提问作者Jeremy Donald

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 00:54:10