你好,我有一个函数,我正在使用散列传递参数,这样:
&group_AoA_to_HoA_by_AoAs_columns({
AoA => \@group_file_by_line_numbers_AoA,
HoA => \%group_file_by_group_names_HoA,
key_index => 0,
columns => "ALL",
save_method => \&append_or_overwrite,
action => "ADD"
});在这个函数中,我以这种方式访问传递的变量:
my $AoA = $args->{"AoA"};
my $HoA = $args->{"HoA"};
my $key_index = $args->{"key_index"};
my $columns = $args->{"columns"};
my $save_method = $args->{"save_method"};
my $action = $args->{"action"};参数"save_method"是另一个函数的名称(作为参数传递给group_AoA_to_HoA_by_AoAs_columns函数)。这个函数也被调用(从group_AoA_to_HoA_by_AoAs_columns函数),其中包含一些传递的参数:
$save_method->({
action => $action,
position => \$HoA->{ $array->[$key_index] },
data => [@selected_columns],
});参数"action"第一次传递给"group_AoA_to_HoA_by_AoAs_columns"函数,第二次传递给"save_method"所引用的函数。这一论点没有其他理由。
最后,我的问题是,如果可以将这段代码重写成更统一的等价代码,那么"action"参数是否仅由"save_method"所指的函数使用?像这样的事就好了:
&group_AoA_to_HoA_by_AoAs_columns({
AoA => \@group_file_by_line_numbers_AoA,
HoA => \%group_file_by_group_names_HoA,
key_index => 0,
columns => "ALL",
save_method => \&append_or_overwrite({
action => "ADD"
})
});发布于 2014-09-11 15:01:30
一个选项是将对save方法的引用包装在一个提供任何静态参数的匿名子例程中:
save_method => sub { append_or_overwrite({ action => 'ADD', %{shift()}}) },%{shift()}允许您使用与当前相同的pass约定指定任何附加参数:
$save_method->({
position => \$HoA->{ $array->[$key_index] },
data => [@selected_columns],
});另一种方法是使用数组引用指定保存方法,其中第一个值是代码引用,任何附加值都是它的参数。
save_method => [\&append_or_overwrite, action => 'ADD'],援引它的理由是:
my ($code, @args) = @$save_method;
$code->({
position => \$HoA->{ $array->[$key_index] },
data => [@selected_columns],
@args,
});切线:在[@selected_columns]创建一个(浅)副本时传递保存方法数据。如果您不需要一个副本(因为保存方法没有修改它),最好编写\@selected_columns将一个引用传递给原始数组。类似地,我不知道为什么您要通过\$HoA->{ $array->[$key_index] }传递位置,这似乎是对数组引用的引用,而不是将数组引用直接作为$HoA->{ $array->[$key_index] }传递。
发布于 2014-09-11 12:56:27
如果要调用具有指定参数的append_or_overwrite,则可以使用匿名函数,
save_method => sub {
# 'return' is optional
return append_or_overwrite({
action => "ADD"
})
}https://stackoverflow.com/questions/25787731
复制相似问题