原型不匹配: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= 中的同名运算符发生冲突]
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
来编写您的代码,它就可以工作您也可以使用
[=50=,它就可以正常工作]first
而不是List::Util
中的any
,其中 returns 块 returns 一个 true 值,只要列表中的所有内容都为 true另一种方法是使用不同的名称从
List::Util
导入any
BEGIN { require List::Util; *my_any = \&List::Util::any; }
现在您有一个子例程
my_any
,其行为与List::Util
中的原始any
完全相同,但不会与 [=16= 中的同名运算符发生冲突]