Ошибка несоответствия прототипа (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 были определены с помощью разных прототипов, чем используемые в коде.