我想创建一个可以处理代码和/或布尔输入的grep {} @
或map {} @
子程序。互联网在某种程度上没有太多关于此的信息。
我尝试在下面创建子,但它甚至无法处理第一次测试。我收到错误Can't locate object method "BoolTest" via package "input" (perhaps you forgot to load "input"?) at C:\path\to\file.pl line 16.
。
这怎么认为它是一个对象?我没有正确创建BoolTest吗?
# Example senarios
BoolTest { 'input' =~ /test[ ]string/xi };
BoolTest { $_ =~ /test[ ]string/xi } @array;
BoolTest(TRUE);
# Example subroutine
sub BoolTest
{
if ( ref($_[0]) == 'CODE') {
my $code = \&{shift @_}; # ensure we have something like CODE
if ($code->()) { say 'TRUE'; } else { say 'FALSE'; }
} else {
if ($_[0]) { say 'TRUE'; } else { say 'FALSE'; }
}
}
答案 0 :(得分:5)
要传递代码引用,您可以使用以下命令:
sub BoolTest { ... }
BoolTest sub { 'input' =~ /test[ ]string/xi };
BoolTest sub { $_ =~ /test[ ]string/xi }, @array;
BoolTest(TRUE);
通过使用map BLOCK LIST
原型,您可以让子语法与&@
具有相似的语法。
sub BoolTest(&@) { ... }
BoolTest { 'input' =~ /test[ ]string/xi };
BoolTest { $_ =~ /test[ ]string/xi } @array;
这会创建相同的匿名潜在客户,因此return
,last
等行为与第一个代码段相同。
请注意,原型版本不会接受
BoolTest(TRUE);
除非你覆盖原型
&BoolTest(TRUE);
但你不应该期望你的来电者这样做。根据您的示例,您可以让他们使用以下内容,但第二个子可能更好。
BoolTest { TRUE };