通过如下更改代码实际上并没有引入任何额外的复杂性:
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;
}