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
而不是在使用之前导入它,但我想导入一次,所以如何避免此警告
非常感谢您的评论。
答案 0 :(得分:4)
有一些可能的解决方案
请注意,我在这里使用核心List::Util
模块,因为它还包含any
函数,不需要在最近的perl版本上安装
正如您自己所说,您可以完全限定子程序而不是导入它,并使用List::Util::any
您可以使用
禁用从any
导入Dancer2
use Dancer2 '!any'
只要你从不需要Dancer2的any
来编写代码
您还可以使用first
代替any
中的List::Util
,any
返回列表的第一个元素,块返回 true 值,只要列表中的所有内容都 true
另一种方法是从List::Util
导入BEGIN {
require List::Util;
*my_any = \&List::Util::any;
}
,其名称不同
my_any
现在您有一个子例程any
,其行为与List::Util
中的原始Dancer2
完全相同,但不会与来自CODE
<的同名运营商冲突/ p>
答案 1 :(得分:3)
Dancer2和List::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
声明。