【问题标题】:Prototype mismatch error (perl)原型不匹配错误(perl)
【发布时间】:2013-04-02 17:10:14
【问题描述】:

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

一切似乎都运行良好,但我想知道这个错误/警告的全部内容是什么?我似乎在网上找不到任何关于它的信息。

【问题讨论】:

  • 您所说的“导入 JSON 模块”是指“预先声明子程序 from_json 和 to_json”吗?像sub from_json;?
  • 不,我的意思是我使用标题“使用 JSON;”在我的模块中,这是一个名为 mymodule.pm 的文件(包含一个同名的包)。然后从我的应用程序文件中,我使用“use mymodule;”导入该模块文件。
  • 不太明白为什么这个问题被否决了。对我来说似乎完全合理。
  • 您是否使用 from_json 和 to_json 传递 1 或 2 个标量参数?
  • 听起来像是一个合理的猜测,但我在下面回答了我自己的问题。

标签: perl module


【解决方案1】:

出现这种情况的另一种情况是您已加载的其他模块定义了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”运行,在use JSON 之后有或没有qw//,您可以看到它是如何工作的:

package Foo;

use Dancer qw/:syntax/;
use JSON qw//;

print Dumper( JSON::from_json('{"bob":"sally"}') ); use Data::Dumper;

1;

【讨论】:

    【解决方案2】:

    我相信 Dancer/2 为您提供了 to_jsonfrom_json,因此您不必使用 JSON。

    这将起作用:

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

    【讨论】:

    • 非常正确。它包含在包中,不仅是 dancer2,还有 dancer(原始版本)。尽管如此,我还是错误地使用了 perl 包,而且这个错误更普遍,与脚本中“use”和“require”出现的顺序有关。
    【解决方案3】:

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

    package mymodule
    

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-16
        • 2014-02-05
        • 1970-01-01
        • 2012-02-16
        • 2012-02-25
        • 1970-01-01
        相关资源
        最近更新 更多