如下修改代码并不会带来任何额外的复杂性:
my $key_tmp = constantOperation($key);
my %output
foreach ( @input ) {
my $output_tmp = special_operation($_);
my $specialKey = specialOperation2($_,$key_tmp);
$output{$specialKey} = $tmp;
}
但是暂时接受你有一个合理的未公开论据来解释你为什么不想这样做,另一种可能性(如果 constantOperation 是一个纯函数)是使用 Memoize。
use Memoize;
memoize 'constantOperation';
my $key = shift;
my @input = @_;
my %output;
foreach( @input ) {
my $output_tmp = special_operation;
my $key_tmp = constantOperation($key);
my $specialKey = specialOperation2($_,$key_tmp);
$output{$specialKey} = $tmp;
}
后者并不能避免重复的函数调用,但确实会导致在名为 constantOperation 的函数内进行缓存,因此使用先前使用的参数的后续调用将提供缓存的结果。
回到第一个示例,您可以将“my”声明移出循环,然后在循环内使用如下内容:$key_tmp //= constantOperation($key);。这可能是这样的:
my $key = shift;
my @input = @_;
my %output;
my $key_tmp;
foreach( @input ) {
my $output_tmp = special_operation;
$key_tmp //= constantOperation($key);
my $specialKey = specialOperation2($_,$key_tmp);
$output{$specialKey} = $tmp;
}
这就是 Perl,总有另一种方法可以做到这一点。启用“状态”功能,并将my $key_tmp 更改为state $key_tmp。这可能是这样的:
use feature 'state';
my $key = shift;
my @input = @_;
my %output;
foreach( @input ) {
my $output_tmp = special_operation;
state $key_tmp = constantOperation($key);
my $specialKey = specialOperation2($_,$key_tmp);
$output{$specialKey} = $tmp;
}