【问题标题】:Debugging Global symbol requires explicit package name调试全局符号需要明确的包名
【发布时间】:2017-09-19 03:42:39
【问题描述】:

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

Global symbol requires explicit package name

Explanation of 'global symbol requires explicit package name'

Why does Perl say Global symbol "SYMBOL" requires explicit package name at PROGRAM.pl line X?

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

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

脚本产生以下输出:

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

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

【问题讨论】:

  • 提示:将$FindBin::Bin 替换为$FindBin::RealBin。前者因脚本的符号链接而损坏。
  • 提示:您实际上不能从 sub(只是标量)返回散列,因此您实际上是在返回散列的键和值并在外部创建一个新的散列。通常会返回对哈希的引用。

标签: perl


【解决方案1】:

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

$vuln{$cve_id} = \%value;

return %vuln; 

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

my @vuln;

将该声明替换为

my %vuln;

【讨论】:

  • 你先生,是个救世主。但现在我明白了: foo.pm 在调用 file(nvd_extract.pl) 第 12 行时没有返回真值。
  • 在模块底部添加1;。模块必须返回一个真值。
猜你喜欢
  • 2011-03-09
  • 2014-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多