Perl JSON to_json не работает после обновления Ubuntu (14.04 -> 16.04)

Обновление: при новой установке проблема исчезла. Я отказался от попыток исправить обновленную Ubuntu.

Исходный вопрос:

Я использую пакет Perl CPAN JSON для преобразования hasref в json с помощью функции to_json.

Это отлично работало в Ubuntu 14.04 с Perl версии 5.18.2, но после обновления до Ubuntu 16.04 с Perl версии 5.22.1 я получаю сообщение об ошибке:

hash- or arrayref expected (not a simple scalar, use allow_nonref to allow this)

Оригинальный код был таким:

my $lang = {
        'connection_lost' => 'Network connection was lost',
        'connection_lost_more' => 'Please refresh this page to fix this problem'
};
my $json_lang = to_json($lang);

Я проверил с помощью warn ref($lang) тип $lang, который вернул "HASH", так что это должен быть hashref?

Я попытался изменить его на это:

my %lang;
$lang{'connection_lost'} = 'Network connection was lost';
$lang{'connection_lost_more'} = 'Please refresh this page to fix this problem';
my $json_lang = to_json(%lang);

и это:

my %lang;
$lang{'connection_lost'} = 'Network connection was lost';
$lang{'connection_lost_more'} = 'Please refresh this page to fix this problem';
my $json_lang = to_json(\%lang);

Оба потерпели неудачу. Затем я попробовал переключатель allow_nonref:

my $lang = {
        'connection_lost' => 'Network connection was lost',
        'connection_lost_more' => 'Please refresh this page to fix this problem'
};
my $jsonnonref = JSON->new->allow_nonref; 
my $json_lang = $jsonnonref->to_json($lang);

что привело к сообщению об ошибке to_json should not be called as a method

Как заставить это работать?

Абсолютный минимальный код, который у меня не работает:

package Handlers::test_handlers;

use strict;
use warnings;
use Apache2::Const -compile => qw(OK);
use Apache2::Request;

use JSON;

sub handler {
        my $lang = {
                'connection_lost' => 'connection_lost',
                'connection_lost_more' => 'connection_lost_more'
        };
        #my $json_lang = 'Hello world';
        my $json_lang = to_json($lang);        
        print $json_lang;
        return Apache2::Const::OK;
}

1;

Использование строки «Hello world» работает, а строки to_json — нет.


person Pit    schedule 06.09.2016    source источник
comment
Я только что попробовал ваш исходный код на Perl 5.22 в Xenial, и он отлично работает. Я думаю, вам нужно показать нам больше вашего кода.   -  person mwp    schedule 06.09.2016
comment
Я думаю, что в какой-то момент JSON переключился на использование JSON::XS или JSON::PP (в порядке предпочтения). Возможно, когда это произошло, его семантика немного изменилась.   -  person redneb    schedule 06.09.2016
comment
Я добавил строку handler(); в конце и установил libapache2-request-perl и libapache2-mod-perl2, и все работает нормально. Используете ли вы системный Perl и модули или что-то вроде Perlbrew для управления средой?   -  person mwp    schedule 06.09.2016
comment
Кроме libapache2-request-perl и libapache2-mod-perl2 я не устанавливал никаких пользовательских пакетов perl. JSON устанавливается через CPAN   -  person Pit    schedule 06.09.2016
comment
Есть ли причина, по которой вы установили JSON через CPAN, а не просто использовали libjson-perl? Обновляли ли вы свои модули CPAN после завершения обновления дистрибутива?   -  person mwp    schedule 06.09.2016
comment
Не совсем. Человек, от которого я унаследовал проект, сказал установить некоторые пакеты через apt-get, а некоторые через CPAN. После обновления я использовал apt-get update/upgrade и даже переустановил все пакеты (apt-get и CPAN). Теперь я вручную удалил все файлы JSON и установил их через apt-get. Все равно не работает, с той же ошибкой.   -  person Pit    schedule 06.09.2016
comment
Вы уверены, что этот пример: my $json_lang = to_json(\%lang); не удался?   -  person stevieb    schedule 06.09.2016
comment
Только что повторил все мои тесты выше с JSON без CPAN, все еще не работает. Я думаю, мне нужно сделать новую установку 16.04, перенести мой код и посмотреть, работает ли это…   -  person Pit    schedule 06.09.2016
comment
Пожалуйста, предоставьте вывод perl -E'use JSON; eval { require JSON::XS }; eval { require JSON::PP }; say "<$_>" for $JSON::VERSION, $JSON::XS::VERSION, $JSON::PP::VERSION, $INC{"JSON.pm"}, JSON->backend, to_json({a=>"b",c=>"d"})'   -  person ikegami    schedule 06.09.2016
comment
@ikegami: ‹2.90› ‹3.01› ‹2.27202› ‹/usr/local/share/perl/5.18.2/JSON.pm› ‹JSON::XS› ‹{c:d,a:b}›   -  person Pit    schedule 07.09.2016
comment
Хм? Вы только что показали, что to_json работает с теми же данными, о которых вы ранее говорили, что это не работает. Вы использовали другой perl на этот раз?   -  person ikegami    schedule 07.09.2016
comment
Нет… вывод одинаков для sudo и не-sudo, кстати.   -  person Pit    schedule 07.09.2016
comment
Ну, вы использовали что-то другое, потому что to_json сработало.   -  person ikegami    schedule 07.09.2016
comment
Мои первые тесты со свежей установкой 16.04 кажутся многообещающими. Никакого json через CPAN не устанавливал, только через apt-get. До сих пор я не нашел мест, где прерывались вызовы to_json или from_json.   -  person Pit    schedule 07.09.2016


Ответы (1)


Теперь у меня возникла та же проблема с новой установкой, и я решил полностью удалить JSON::XS / libjson-xs-perl из проекта, что мгновенно устранило эту проблему.

person Pit    schedule 06.04.2021