不能在〜/ modules / Log / Syslog / Constants.pm第28行使用未定义的值作为ARRAY引用

时间:2016-08-10 05:08:56

标签: perl perl-module

不能在〜/ modules / Log / Syslog / Constants.pm第28行使用未定义的值作为ARRAY引用。 (F)用作硬参考或符号参考的值必须     是一个定义的值。这有助于揭露一些潜在的错误。 完整代码如下:

package Log::Syslog::Fast::Constants;

use strict;

use warnings;

use Log::Syslog::Constants ();
use Carp 'croak';

require Exporter;
our @ISA = qw(Exporter);


use constant LOG_UDP    => 0; # UDP
use constant LOG_TCP    => 1; # TCP
use constant LOG_UNIX   => 2; # UNIX socket


use constant LOG_RFC3164 => 0;
use constant LOG_RFC5424 => 1;

our @EXPORT = ();
our %EXPORT_TAGS = (
    protos =>  [qw/ LOG_TCP LOG_UDP LOG_UNIX /],
    formats => [qw/ LOG_RFC3164 LOG_RFC5424 /],
);
$EXPORT_TAGS{$_} = $Log::Syslog::Constants::EXPORT_TAGS{$_}
    for qw(facilities severities);
our @EXPORT_OK = @{ $EXPORT_TAGS{all} } = map {@$_} values %EXPORT_TAGS;

sub AUTOLOAD {
    (my $meth = our $AUTOLOAD) =~ s/.*:://;
    if (Log::Syslog::Constants->can($meth)) {
        return Log::Syslog::Constants->$meth(@_);
    }
    croak "Undefined subroutine $AUTOLOAD";
}

1;

1 个答案:

答案 0 :(得分:0)

问题是由使用与Log::Syslog::Constants模块不兼容的Log::Syslog::Constants::Fast模块引起的。

::Fast模块正在尝试将导入委托给Log::Syslog::Constants,但是一个或多个委托导入组(列表qw(facilities severities)之一)不在%EXPORT_OK中} Log::Syslog::Constants模块的哈希,意味着::Fast模块在​​第27行引入undef而不是该字段的值。

有两种方法可以实现:

可能性1:有一个不相关的模块自称Log::Syslog::Constants

要对此进行调试,请在use Data::Dumper; print Dumper(\%INC);模块中::Fast查看Constants.pm正在加载的内容,并确保其位于其余部分的同一位置Log::Syslog非快速模块存在。

如果不是,check your module search path并确保它可以找到非::Fast模块,并且没有任何内容正在修改搜索位置(例如use lib)以找到某些内容否则在真实事物之前调用自己Log::Syslog::Constants - 这将导致一个坏模块到"阴影"好的,总是得到加载。

可能性2:您系统上安装的Log::Syslog::Constants版本与Log::Syslog::Constants::Fast版本不兼容。

要对此进行调试,请检查Log::Syslog::Constants的源代码,以确保其%EXPORT_OK中包含两个委托导入组。

如果不是,请确定是否应升级,降级或更改包源(通常不是一个好主意)来解决问题。它也可以通过升级,降级或更改::Fast模块的来源来解决;无论你喜欢什么。无论如何,您都需要拥有一个与非::Fast基本版本兼容的::Fast包装器。