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