Perl 调试全局符号需要显式的包名

Perl 调试全局符号需要显式的包名,perl,Perl,这是我第一次接触Perl。我知道之前有人问过这个问题,我已经核实过了 但我无法在我的代码中找到错误。我的任务是调试这个。任何帮助都将不胜感激 package foo; use strict; use warnings; use XML::LibXML; sub extract { my $fname = shift or warn("provide the XML file to load\n"), return

这是我第一次接触Perl。我知道之前有人问过这个问题,我已经核实过了

但我无法在我的代码中找到错误。我的任务是调试这个。任何帮助都将不胜感激

package foo;



use strict;
use warnings;

use XML::LibXML;


sub extract {
    my $fname = shift
        or warn("provide the XML file to load\n"),
           return;

    my $xml = XML::LibXML->load_xml(location => $fname);
    my ($nvd)  = $xml->nonBlankChildNodes;

    my @vuln;
    for my $entry ($nvd->nonBlankChildNodes) {
        my %value;
        # %value = parse_nvd_entry($entry);

        for my $attr ($entry->attributes) {
            $value{$attr->nodeName} = $attr->nodeValue;
        }

        # rename 'name' to 'cve_id'
        my $cve_id = $value{cve_id} = delete $value{name};
        
        $vuln{$cve_id} = \%value;
    }

    return  %vuln;
}
这个包在这里被调用

use strict;
use warnings;

use FindBin;
use lib qq($FindBin::Bin/../lib);

use foo;
use Dumpvalue;

if (@ARGV != 1) {
   die "Extract vulnerability records into database file\n",
       "Usage:\n    $0 <NVD_XML_files>\n\n";
}

my %vuln = foo::extract(@ARGV);

Dumpvalue->new->dumpValue(\%vuln);
使用严格;
使用警告;
使用FindBin;
使用libqq($FindBin::Bin/./lib);
使用foo;
使用Dumpvalue;
如果(@ARGV!=1){
die“将漏洞记录提取到数据库文件\n”,
“用法:\n$0\n\n”;
}
我的%vuln=foo::extract(@ARGV);
Dumpvalue->new->Dumpvalue(\%vuln);
该脚本生成以下输出:

全局符号“%vuln”要求在/Users/dev/projects/software/foo/scripts/./lib/foo.pm第35行显示包名

全局符号“%vuln”要求在/Users/dev/projects/software/foo/scripts/./lib/foo.pm第38行显示包名


您使用了一个名为
%vuln
且从未声明过的哈希

$vuln{$cve_id} = \%value;

您声明了一个名为
@vuln
的数组,该数组从未使用过

my @vuln;
将该声明替换为

my %vuln;

您使用了一个名为
%vuln
且从未声明过的哈希

$vuln{$cve_id} = \%value;

您声明了一个名为
@vuln
的数组,该数组从未使用过

my @vuln;
将该声明替换为

my %vuln;

提示:将
$FindBin::Bin
替换为
$FindBin::RealBin
。前者因指向脚本的符号链接而被破坏。提示:您实际上无法从sub(仅标量)返回散列,因此您实际上是在返回散列的键和值,并在外部创建新的散列。通常会返回对哈希的引用。提示:将
$FindBin::Bin
替换为
$FindBin::RealBin
。前者因指向脚本的符号链接而被破坏。提示:您实际上无法从sub(仅标量)返回散列,因此您实际上是在返回散列的键和值,并在外部创建新的散列。人们通常会返回对散列的引用。先生,你是救世主。但现在我明白了:foo.pm在调用文件(nvd_extract.pl)第12行没有返回真值到模块底部。模块必须返回一个真实值。先生,您是救世主。但现在我明白了:foo.pm在调用文件(nvd_extract.pl)第12行没有返回真值到模块底部。模块必须返回一个真值。