使用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);
答案 0 :(得分:4)
不要使用原型,除非你知道完全他们做了什么。原型的目的是改变调用站点解析的方式,并在参数上强加强加上下文。在各种情况下,原型被忽略,方法调用就是这些情况之一(因为无法确定在运行时调用哪个方法)。
原型(\&@)
意味着应该像
foo &bar, 1, 2, 3;
在我的整个Perl生活中,我从未见过它。而不是实际调用bar
,该函数作为引用传递。不要那样做。此外,如果没有&
sigil它也无法工作,并且无论如何都无法使用方法。
原型也不是类型约束。
您的someMappingFunction
应如下:
sub someMappingFunction {
my ($self, $function) = @_;
return map { $function->($_) } @{ $self->{some_internal_array} };
}
@{ ... }
的数组引用来展平它。 map
在列表上运行,而不是在阵列上运行。您的create_mapping_function
状态良好。
调用看起来像
$someObject->someMappingFunction(create_mapping_function("value", "key"));
注意事项:
$
sigil。'$option'
。请注意,它不会在替换中进行评估。$foo->bar
。否则,方法调用紧跟在parens中的arglist,例如$foo->bar()
或$foo->bar(1,2,3)
。