18

将我编写的模块导入我的 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

4 回答 4

17

出现这种情况的另一种情况是,当您加载的其他模块定义了 from_json/to_json 时。我最近多次提到的一个例子是 Dancer。如果你有一个包

package Foo;

use Dancer qw/:syntax/;
use JSON;

1;

您将收到该警告,因为(显然)具有 :syntax 导入的 Dancer 将 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;
于 2014-05-28T15:00:39.793 回答
4

我相信 Dancer/2 提供to_jsonfrom_json你,所以你不必使用 JSON。

这将起作用:

use Dancer2 ':syntax';
get '/cheeseburgers' => {
    return to_json($restaurant->make_cheeseburgers);
}
于 2015-04-11T12:47:06.083 回答
3

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

package mymodule

而不是之后。包声明必须放在第一位。

于 2013-04-02T18:18:01.240 回答
1

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

于 2013-04-02T17:15:48.963 回答