Ошибка несоответствия прототипа (perl)
Я получаю эту странную ошибку при импорте модуля, который я написал в своем приложении Dancer.
Prototype mismatch: sub main::from_json: none vs ([email protected]) at mymodule.pm line 6.
Prototype mismatch: sub main::to_json: none vs ([email protected]) at mymodule.pm line 6.
Я предполагаю, что это связано с тем, что в моем модуле я импортирую модуль Perl JSON.
Кажется, все работает отлично, но мне интересно, что это за ошибка/предупреждение? Кажется, я ничего не могу найти в Интернете.
Ответы
Ответ 1
Другая ситуация, когда это возникает, - это когда какой-либо другой загруженный вами модуль определяет from_json/to_json. Пример, который я недавно пару раз ударил с Dancer. Если у вас есть пакет с
package Foo;
use Dancer qw/:syntax/;
use JSON;
1;
Вы получите это предупреждение, потому что (по-видимому) Dancer с импортом синтаксиса помещает from_json и to_json в ваше пространство имен.
Быстрое решение в этой ситуации - просто явно не импортировать ничего из JSON:
package Foo;
use Dancer qw/:syntax/;
use JSON qw//;
1;
Затем в вашем коде вам нужно будет использовать полное имя пакета для получения JSON-подтипов, например:
my $hash = JSON::from_json('{"bob":"sally"}');
В такой ситуации, однако, вы хотите использовать полные имена пакетов, чтобы он очистил, какую функцию вы получаете, - есть несколько объявлений to_json/from_json, поэтому давайте очень ясно, что мы имеем в виду.
Если вы поместите в Foo.pm следующее: "perl Foo.pm", с qw//
и после qw//
после use JSON
, вы можете увидеть, как он работает:
package Foo;
use Dancer qw/:syntax/;
use JSON qw//;
print Dumper( JSON::from_json('{"bob":"sally"}') ); use Data::Dumper;
1;
Ответ 2
Я считаю, что Dancer/2 предоставляет вам to_json
и from_json
, поэтому вам не нужно использовать JSON.
Это будет работать:
use Dancer2 ':syntax';
get '/cheeseburgers' => {
return to_json($restaurant->make_cheeseburgers);
}
Ответ 3
Причина, по которой я получал эту ошибку, заключалась в том, что в моем собственном модуле я использовал директиву использования и импортировал JSON и другие модули, прежде чем я объявил свое собственное пространство имен пакетов, с
package mymodule
вместо ПОСЛЕ. Декларация пакета должна быть первой.
Ответ 4
См. Прототипы в perlsub. Функции from_json
и to_json
были определены с помощью разных прототипов, чем используемые в коде.