0

使用 Perl 5+,此代码是否映射我的内部数组?

package somepackage; 
(...)
sub someMappingFunction (\&@) {
    my $this = shift; 
    #well should not because the object is supposed 
    #to a blessed hash reference and not a function.
    my $f = shift; 
    map { &$f($_) } $this->{'some_internal_array'}; 
}

如何更正它以便以这种方式调用该函数?

sub create_mapping_function {
    # this is even more complicated in my real application!
    my $value = shift; 
    my $key = shift;
    return sub {
           my $line = shift; 
           $line=~s/$key/$value/;
           return $line; 
    }
}
(... long, very long ...)
myObject->someMappingFunction create_mapping_function('$option',42);
(...)
mySecondObject->someMappingFunction create_mapping_function('$option',65);
4

1 回答 1

4

不要使用原型,除非您确切地知道它们的作用。原型的目的是改变调用站点的解析方式,并将上下文强加于参数。原型被忽略的情况有很多,方法调用就是其中一种情况(因为无法确定在运行时会调用哪个方法)。

原型(\&@)意味着该函数应该被称为

foo &bar, 1, 2, 3;

在我的整个 Perl 生活中,我从未见过这种情况。bar该函数不是实际调用,而是作为引用传递。不要那样做。此外,如果没有&印记,它就无法工作,而且无论如何它也无法与方法一起使用。

原型也不是类型约束。

someMappingFunction应该看起来像:

sub someMappingFunction {
  my ($self, $function) = @_;
  return map { $function->($_) } @{ $self->{some_internal_array} };
}
  • 这个 sub 不希望在 coderef 之后有进一步的参数。
  • 散列只包含标量,例如引用,但从不包含数组本身。我们必须用circumfix取消引用该数组引用以@{ ... }使其变平。作用于列表,而map不是数组。

create_mapping_function的没问题。

调用看起来像

$someObject->someMappingFunction(create_mapping_function("value", "key"));

注意事项:

  • 对象只是特殊的标量变量,因此它们有一个$印记。
  • 我不确定您是否真的要传递文字字符串'$option'。请注意,它不会在替换中进行评估。
  • 方法调用要么不带参数,然后我们可以去掉括号,比如$foo->bar. 否则,方法调用后紧跟一个括号中的 arglist,例如$foo->bar()or $foo->bar(1,2,3)
于 2013-09-11T08:55:11.833 回答