【问题标题】:Can't use an undefined value as an ARRAY reference at ~/modules/Log/Syslog/Constants.pm line 28不能在 ~/modules/Log/Syslog/Constants.pm 第 28 行使用未定义的值作为 ARRAY 引用
【发布时间】:2016-12-16 07:44:15
【问题描述】:

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

【问题讨论】:

  • 这对我来说很好用。你怎么做才能得到这个错误?这个文件的位置,Constants.pm,正确吗?另一个想法——显然恰好有一个名称完全相同的模块,used by Log::Syslog::Fast。这有关系吗,有冲突吗?
  • “为我工作”是指以下内容。我use这个模块(在文件Constants.pm中放置在Log/Syslog/Fast/中)在一个脚本中,在use Log::Syslog::Fast::Constants qw(:severities)之后我可以打印常量(作为裸词)LOG_DEBUG等。这有帮助吗?

标签: perl perl-module


【解决方案1】:

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

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

这有几种可能发生的方式:

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

要对此进行调试,请在 ::Fast 模块中执行 use Data::Dumper; print Dumper(\%INC); 以查看 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 包装器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多