原型不匹配错误(perl)

时间:2013-04-02 17:10:15

标签: perl module

导入我写入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模块。

一切似乎都表现不错,但我想知道这个错误/警告到底是什么?我似乎无法在网上找到任何关于它的信息。

4 个答案:

答案 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_jsonfrom_json,因此您不必使用JSON。

这将有效:

use Dancer2 ':syntax';
get '/cheeseburgers' => {
    return to_json($restaurant->make_cheeseburgers);
}

答案 2 :(得分:2)

我收到此错误的原因是因为在我自己的模块中,我使用了use指令并在我声明自己的包名称空间之前导入了JSON和其他模块,

package mymodule

而不是AFTER。包装声明必须先行。

答案 3 :(得分:1)

请参阅perlsub中的原型。函数from_jsonto_json使用与代码中使用的原型不同的原型进行定义。