原型不匹配:在Exporter.pm

时间:2016-10-28 07:48:05

标签: perl any subroutine-prototypes

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并发出警告

存在冲突

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

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

非常感谢您的评论。

3 个答案:

答案 0 :(得分:4)

有一些可能的解决方案

请注意,我在这里使用核心List::Util模块,因为它还包含any函数,不需要在最近的perl版本上安装

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

  • 您可以使用

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

    只要你从不需要Dancer2的any来编写代码

  • 您还可以使用first代替any中的List::Utilany返回列表的第一个元素,块返回 true 值,只要列表中的所有内容都 true

  • ,它就会正常工作
  • 另一种方法是从List::Util导入BEGIN { require List::Util; *my_any = \&List::Util::any; } ,其名称不同

    my_any

    现在您有一个子例程any,其行为与List::Util中的原始Dancer2完全相同,但不会与来自CODE <的同名运营商冲突/ p>

答案 1 :(得分:3)

Dancer2List::MoreUtils都会将any函数导出到您的命名空间中。

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

  

一次为多个HTTP方法定义路由

List :: MoreUtils就像grep一样。

  

如果LIST中的任何项目符合通过BLOCK给出的标准,则返回true值。

您看到的警告是因为您先导入了the Dancer2 one,所以Perl了解了那个原型。然后导入了the one from List::MoreUtils,它覆盖了您的命名空间&main::any中的main::,但原型仍在那里。

您可以避免从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;

答案 2 :(得分:-1)

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

您只需要use声明。