Проблема Perl с DateTime :: Format :: ISO8601 отслеживается, чтобы проблема с Params :: Validate? - PullRequest
2 голосов
/ 07 февраля 2012

Надеюсь, что кто-то сможет пролить свет на это ...

Я и многие другие разработчики в команде запускаем крупномасштабное приложение для perl.Несмотря на то, что все это работает нормально на всех ноутбуках (Linux и Mac), я не могу всю жизнь запускать этот тест на своем большом ПК дома.

Я установил все зависимости через cpan,но я получаю следующее в журналах ошибок Apache при посещении сайта:

The 'regex' parameter ("(?x-ism:^ (\d{4}) (\d\d) (\d\d) $)") to DateTime::Format::Builder::Parser::create_single_parser was an 'unknown', which is not one of the allowed types: scalarref
 at /usr/local/lib/perl/5.12.4/Params/ValidatePP.pm line 651
    Params::Validate::__ANON__('The \'regex\' parameter ("(?x-ism:^ (\d{4}) (\d\d) (\d\d) $)"...') called at /usr/local/lib/perl/5.12.4/Params/ValidatePP.pm line 491
    Params::Validate::_validate_one_param('Regexp=REGEXP(0x7f8a3aad06e8)', 'HASH(0x7f8a3aaea840)', 'HASH(0x7f8a3aa75aa8)', 'The \'regex\' parameter ("(?x-ism:^ (\d{4}) (\d\d) (\d\d) $)")') called at /usr/local/lib/perl/5.12.4/Params/ValidatePP.pm line 353
    Params::Validate::validate('ARRAY(0x7f8a3aa33808)', 'HASH(0x7f8a3aa32db8)') called at /usr/local/share/perl/5.12.4/DateTime/Format/Builder/Parser.pm line 312
    DateTime::Format::Builder::Parser::create_single_parser(undef, 'params', 'ARRAY(0x7f8a3aad0640)', 'length', 8, 'regex', 'Regexp=REGEXP(0x7f8a3aad06e8)') called at /usr/local/share/perl/5.12.4/DateTime/Format/Builder/Parser.pm line 504
    DateTime::Format::Builder::Parser::sort_parsers('DateTime::Format::Builder::Parser', 'HASH(0x7f8a3aa4e2b8)', 'ARRAY(0x7f8a3aa3f148)') called at /usr/local/share/perl/5.12.4/DateTime/Format/Builder/Parser.pm line 398
    DateTime::Format::Builder::Parser::create_multiple_parsers('DateTime::Format::Builder::Parser', 'HASH(0x7f8a3aa4e2b8)', 'HASH(0x7f8a3aad06b8)', 'HASH(0x7f8a3aad0808)', 'HASH(0x7f8a3aad0910)', 'HASH(0x7f8a3aad0a00)', 'HASH(0x7f8a3aad0b08)', 'HASH(0x7f8a3aad0cb8)', 'HASH(0x7f8a3aad0e50)', ...) called at /usr/local/share/perl/5.12.4/DateTime/Format/Builder/Parser.pm line 603
    DateTime::Format::Builder::Parser::create_parser('DateTime::Format::Builder::Parser', 'ARRAY(0x7f8a3a72fc88)', 'HASH(0x7f8a3aad06b8)', 'HASH(0x7f8a3aad0808)', 'HASH(0x7f8a3aad0910)', 'HASH(0x7f8a3aad0a00)', 'HASH(0x7f8a3aad0b08)', 'HASH(0x7f8a3aad0cb8)', 'HASH(0x7f8a3aad0e50)', ...) called at /usr/local/share/perl/5.12.4/DateTime/Format/Builder.pm line 158
    DateTime::Format::Builder::create_parser('DateTime::Format::Builder', 'ARRAY(0x7f8a3aae5450)') called at /usr/local/share/perl/5.12.4/DateTime/Format/Builder.pm line 177
    DateTime::Format::Builder::create_end_parser('DateTime::Format::Builder', 'ARRAY(0x7f8a3aae5450)') called at /usr/local/share/perl/5.12.4/DateTime/Format/Builder.pm line 106
    DateTime::Format::Builder::create_class(undef, 'parsers', 'HASH(0x7f8a3aae8f18)') called at /usr/local/share/perl/5.12.4/DateTime/Format/ISO8601.pm line 175

Я застрял некоторые noddy print STDERR прямо в ValidatePP.pm, так что если вы смотрите наномера строк и они немного пропущены, но в основном в ValidatePP.pm он попадает в следующий блок кода в sub _get_type:

 # I really hope this never happens.
 return UNKNOWN;

Если это помогает, запуск perl -v возвращает следующую версию вэтот ПК

Это Perl 5, версия 12, Subversion 4 (v5.12.4), созданная для x86_64-linux-gnu-thread-multi

Кто-нибудь?

ОБНОВЛЕНИЕ:

Если это помогает, подпрограмма _get_type в основном решает (используя UNIVERSAL::isa), что regex: !!perl/regexp (?x-ism:^ (\d{4}) (\d\d) (\d\d) $) не одно, если следующее:

my %isas = (
        'ARRAY'  => ARRAYREF,
        'HASH'   => HASHREF,
        'CODE'   => CODEREF,
        'GLOB'   => GLOBREF,
        'SCALAR' => SCALARREF,
    );

1 Ответ

1 голос
/ 07 февраля 2012

Прежде всего, используете ли вы последнюю версию Params :: Validate (и все остальные модули)?Согласно changelog в P :: V 1.01 были некоторые ошибки:

1.02 2012-02-06

  • Предыдущийrelease никогда не загружал реализацию XS, даже если она была скомпилирована.

  • В более новых версиях Perl чистая реализация Perl воспринимала объекты regexp иначе, чем реализация XS.Они должны рассматриваться как принадлежащие к типу SCALARREF для обратной совместимости.

  • Эти две ошибки вместе сумели сломать наборы тестов ряда модулей на CPAN.Этот выпуск должен исправить их.

...