首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl -函数作为函数参数传递的参数-很好且清晰的方式

Perl -函数作为函数参数传递的参数-很好且清晰的方式
EN

Stack Overflow用户
提问于 2014-09-11 12:41:52
回答 2查看 79关注 0票数 1

你好,我有一个函数,我正在使用散列传递参数,这样:

代码语言:javascript
复制
&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"
});

在这个函数中,我以这种方式访问传递的变量:

代码语言:javascript
复制
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函数),其中包含一些传递的参数:

代码语言:javascript
复制
$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"所指的函数使用?像这样的事就好了:

代码语言:javascript
复制
&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"
    })
});
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-11 15:01:30

一个选项是将对save方法的引用包装在一个提供任何静态参数的匿名子例程中:

代码语言:javascript
复制
save_method => sub { append_or_overwrite({ action => 'ADD', %{shift()}}) },

%{shift()}允许您使用与当前相同的pass约定指定任何附加参数:

代码语言:javascript
复制
$save_method->({
    position => \$HoA->{ $array->[$key_index] },
    data     => [@selected_columns],
});

另一种方法是使用数组引用指定保存方法,其中第一个值是代码引用,任何附加值都是它的参数。

代码语言:javascript
复制
save_method => [\&append_or_overwrite, action => 'ADD'],

援引它的理由是:

代码语言:javascript
复制
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] }传递。

票数 3
EN

Stack Overflow用户

发布于 2014-09-11 12:56:27

如果要调用具有指定参数的append_or_overwrite,则可以使用匿名函数,

代码语言:javascript
复制
save_method  => sub {
  # 'return' is optional
  return append_or_overwrite({
                      action       => "ADD"
  })
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25787731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档