2016-08-10 9 views
4

Невозможно использовать неопределенное значение в качестве ссылки ARRAY в ~/modules/Log/Syslog/Constants. pm строка 28. (F) Значение, используемое как жесткая ссылка или символическая ссылка, должно быть быть определенным значением. Это помогает совершить некоторые коварные ошибки. Полный код выглядит следующим образом:Невозможно использовать неопределенное значение в качестве ссылки ARRAY в ~/modules/Log/Syslog/Constants.pm строка 28

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; 
+0

Это прекрасно работает для меня. Что вы делаете, чтобы получить эту ошибку? Правильно ли размещен этот файл, 'Constants.pm'? Другая мысль - видимо, существует модуль с таким же именем, 'use'd by' Log :: Syslog :: Fast'. Связано ли это с конфликтами? – zdim

+0

Под «работает для меня» я имею в виду следующее. Я использую этот модуль (в файле 'Constants.pm', помещенного в' Log/Syslog/Fast/') в скрипте, и после' use Log :: Syslog :: Fast :: Constants qw (: severities) ' Я могу напечатать константу (как гонор) 'LOG_DEBUG' и т. Д. Помогает ли это? – zdim

ответ

0

Проблема вызвана использованием Log::Syslog::Constants модуля, который не совместим с вашим Log::Syslog::Constants::Fast модулем.

Модуль ::Fast пытается передать импорт в Log::Syslog::Constants, но одна или несколько групп делегатов импорта (один из списка 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, чтобы убедиться, что обе группы импорта делегатов содержатся в его %EXPORT_OK.

Если это не так, определите, следует ли вам обновлять, понижать или изменять исходный код пакета (обычно это не очень хорошая идея) для решения проблемы. Он также может быть разрешен путем обновления, понижения или изменения источника модуля ::Fast; какой бы вы ни предпочли бы. Вам понадобится обертка ::Fast, которая совместима с базовой версией ::Fast, несмотря на это.