Perl,如何创建map / grep like子例程?

时间:2015-01-29 19:14:16

标签: perl arguments

我想创建一个可以处理代码和/或布尔输入的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'; }
   }
}

1 个答案:

答案 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;

这会创建相同的匿名潜在客户,因此returnlast等行为与第一个代码段相同。

请注意,原型版本不会接受

BoolTest(TRUE);

除非你覆盖原型

&BoolTest(TRUE);

但你不应该期望你的来电者这样做。根据您的示例,您可以让他们使用以下内容,但第二个子可能更好。

BoolTest { TRUE };