我想创建一个类似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'; }
}
}
Run Code Online (Sandbox Code Playgroud)
要传递代码引用,可以使用以下命令:
sub BoolTest { ... }
BoolTest sub { 'input' =~ /test[ ]string/xi };
BoolTest sub { $_ =~ /test[ ]string/xi }, @array;
BoolTest(TRUE);
Run Code Online (Sandbox Code Playgroud)
map BLOCK LIST通过使用&@原型,您可以使sub具有类似的语法.
sub BoolTest(&@) { ... }
BoolTest { 'input' =~ /test[ ]string/xi };
BoolTest { $_ =~ /test[ ]string/xi } @array;
Run Code Online (Sandbox Code Playgroud)
这就造成同一匿名潜艇是比较早,所以return,last等会表现的一样,在第一个片段.
请注意,原型版本不接受
BoolTest(TRUE);
Run Code Online (Sandbox Code Playgroud)
除非你覆盖原型
&BoolTest(TRUE);
Run Code Online (Sandbox Code Playgroud)
但是你不应该指望你的来电者这样做.根据您的示例,您可以让他们使用以下内容,但第二个子可能更好.
BoolTest { TRUE };
Run Code Online (Sandbox Code Playgroud)