Perl 调试全局符号需要显式的包名
这是我第一次接触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
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行没有返回真值代码>到模块底部。模块必须返回一个真值。