不能在 ~/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;

最佳答案

该问题是由使用与您的 Log::Syslog::Constants 模块不兼容的 Log::Syslog::Constants::Fast 模块引起的。
::Fast 模块试图将导入委托(delegate)给 Log::Syslog::Constants ,但是一个或多个委托(delegate)导入组(列表 qw(facilities severities) 之一)不在 %EXPORT_OK 模块的 Log::Syslog::Constants 哈希中,这意味着 ::Fast 模块提取的是 undef 而不是值对于第 27 行的那个字段。

有几种方法可能会发生这种情况:

可能性 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 的源代码以确保两个委托(delegate)导入组都包含在其 %EXPORT_OK 中。

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

关于perl - 不能在 ~/modules/Log/Syslog/Constants.pm 第 28 行使用未定义的值作为 ARRAY 引用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38864676/

10-13 00:25