Обновление: при новой установке проблема исчезла. Я отказался от попыток исправить обновленную 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 — нет.
JSON
переключился на использованиеJSON::XS
илиJSON::PP
(в порядке предпочтения). Возможно, когда это произошло, его семантика немного изменилась. - person redneb   schedule 06.09.2016handler();
в конце и установил libapache2-request-perl и libapache2-mod-perl2, и все работает нормально. Используете ли вы системный Perl и модули или что-то вроде Perlbrew для управления средой? - person mwp   schedule 06.09.2016my $json_lang = to_json(\%lang);
не удался? - person stevieb   schedule 06.09.2016perl -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.2016to_json
работает с теми же данными, о которых вы ранее говорили, что это не работает. Вы использовали другойperl
на этот раз? - person ikegami   schedule 07.09.2016to_json
сработало. - person ikegami   schedule 07.09.2016