导入我写入Dancer应用程序的模块时出现这个奇怪的错误。
Prototype mismatch: sub main::from_json: none vs ($@) at mymodule.pm line 6.
Prototype mismatch: sub main::to_json: none vs ($@) at mymodule.pm line 6.
我想这是因为在我的模块中我正在导入perl JSON模块。
一切似乎都表现不错,但我想知道这个错误/警告到底是什么?我似乎无法在网上找到任何关于它的信息。
答案 0 :(得分:14)
出现这种情况的另一种情况是你加载的其他模块定义了from_json / to_json。最近我打过几次的一个例子是Dancer。如果你有一个包
package Foo;
use Dancer qw/:syntax/;
use JSON;
1;
你会收到警告,因为(显然)舞者使用:syntax import会将from_json和to_json放入你的命名空间。
在这种情况下的快速解决方案是只从JSON中明确导入任何内容:
package Foo;
use Dancer qw/:syntax/;
use JSON qw//;
1;
然后在您的代码中,您将需要使用完整的包名来获取JSON的subs,如下所示:
my $hash = JSON::from_json('{"bob":"sally"}');
在这种情况下,你想要使用完整的软件包名称,这样就可以清楚你得到了哪个函数 - 有多个to_json / from_json的声明,所以让我们非常明确我们的意思。
如果你把以下内容放在Foo.pm中并使用“perl Foo.pm”运行,在qw//
之后有use JSON
和不带package Foo;
use Dancer qw/:syntax/;
use JSON qw//;
print Dumper( JSON::from_json('{"bob":"sally"}') ); use Data::Dumper;
1;
,你可以看到它是如何工作的:
{{1}}
答案 1 :(得分:4)
我相信Dancer / 2会为您提供to_json
和from_json
,因此您不必使用JSON。
这将有效:
use Dancer2 ':syntax';
get '/cheeseburgers' => {
return to_json($restaurant->make_cheeseburgers);
}
答案 2 :(得分:2)
我收到此错误的原因是因为在我自己的模块中,我使用了use指令并在我声明自己的包名称空间之前导入了JSON和其他模块,
package mymodule
而不是AFTER。包装声明必须先行。
答案 3 :(得分:1)
请参阅perlsub中的原型。函数from_json
和to_json
使用与代码中使用的原型不同的原型进行定义。