原型不匹配:sub main::any: none vs (&@) at Exporter.pm

Prototype mismatch: sub main::any: none vs (&@) at Exporter.pm

use Dancer2;
use List::Util qw(any);

sub use_any_subroutine {

    foreach my $foo (@$foo_array) {
        next unless any { $_ == $foo->id } @hello_world;
    }    
    return;
}

使用 List::Util 并发出警告存在冲突

原型不匹配:sub main::any: none vs (&@) at Exporter.pm(...).

我找到了一个解决方案,我们可以使用List::Util::any而不是在使用前导入它,但是我想导入一次,所以如何避免这个警告

非常感谢您的评论。

如果没有看到您的程序的更多内容,则无法确定,但可以猜测,您已经声明了自己的子例程 sub any 并尝试从 List::MoreUtils 导入它。

您只需要 use 语句。

两者 Dancer2 and List::MoreUtils 都将 any 函数导出到您的命名空间中。

对于 Dancer2,它是其 DSL 的一部分,用作匹配传入请求中任何 HTTP 动词的路由定义。

Defines a route for multiple HTTP methods at once

List::MoreUtils 就像 grep 一样。

Returns a true value if any item in LIST meets the criterion given through BLOCK.

您看到的警告是因为您导入了 the Dancer2 one first, so Perl learned about the prototype of that one. Then you imported the one from List::MoreUtils,它在您的命名空间 main:: 中覆盖了 &main::any,但原型仍然存在。

您可以避免从 Dancer2 导入 any

use Dancer2 qw( !any );
use List::MoreUtils qw( any );

get '/' => sub {
    my @foo = ( 1, 2, 3 );
    return List::MoreUtils::any { $_ == 2 } @foo;
};

dance;

或者您可以避免从 List::MoreUtils 导入 any(使用 List::MoreUtils::any 而不是 any)。

use Dancer2;
use List::MoreUtils qw( );

get '/' => sub {
    my @foo = ( 1, 2, 3 );
    return List::MoreUtils::any { $_ == 2 } @foo;
};

dance;

有几个可能的解决方案

请注意,我在这里使用的是核心 List::Util 模块,因为它还包含一个 any 功能,不需要在最新版本的 perl

上安装
  • 正如您自己所说,您可以完全限定子例程而不是导入它,并使用 List::Util::any

  • 您可以使用

    禁用从Dancer2导入any
    use Dancer2 '!any'
    

    只要您永远不需要 Dancer2 的 any 来编写您的代码,它就可以工作

  • 您也可以使用 first 而不是 List::Util 中的 any,其中 returns 块 returns 一个 true 值,只要列表中的所有内容都为 true

    [=50=,它就可以正常工作]
  • 另一种方法是使用不同的名称从 List::Util 导入 any

    BEGIN {
        require List::Util;
        *my_any = \&List::Util::any;
    }
    

    现在您有一个子例程 my_any,其行为与 List::Util 中的原始 any 完全相同,但不会与 [=16= 中的同名运算符发生冲突]