【问题标题】:Perl - argument passing for function as function argument - nice and clear wayPerl - 将函数作为函数参数传递的参数 - 好而清晰的方法
【发布时间】:2014-09-11 12:41:52
【问题描述】:

您好,我有一个函数,我使用哈希向其传递参数,这样:

&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"
    })
});

【问题讨论】:

  • 下面有很多好的建议,但我只是想添加一条评论。请不要使用& 调用 Perl 子例程。自 1994 年以来就没有必要这样做了,而且可能会令人困惑。

标签: perl function arguments


【解决方案1】:

如果你想用指定的参数调用append_or_overwrite,你可以使用匿名函数,

save_method  => sub {
  # 'return' is optional
  return append_or_overwrite({
                      action       => "ADD"
  })
}

【讨论】:

    【解决方案2】:

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

    save_method => sub { append_or_overwrite({ action => 'ADD', %{shift()}}) },
    

    %{shift()} 允许您使用与当前相同的 pass-a-hashref 约定指定任何其他参数:

    $save_method->({
        position => \$HoA->{ $array->[$key_index] },
        data     => [@selected_columns],
    });
    

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

    save_method => [\&append_or_overwrite, action => 'ADD'],
    

    调用它:

    my ($code, @args) = @$save_method;
    $code->({
        position => \$HoA->{ $array->[$key_index] },
        data     => [@selected_columns],
        @args,
    });
    

    Tangent:将保存方法数据作为[@selected_columns] 传递会创建一个(浅)副本。如果不需要副本(因为 save 方法不会修改它),最好写 \@selected_columns 来传递对原始数组的引用。同样,我不确定您为什么要通过 \$HoA->{ $array->[$key_index] } 传递位置,这似乎是对数组引用的引用,而不是直接将数组引用作为 $HoA->{ $array->[$key_index] } 传递给它。

    【讨论】:

      猜你喜欢
      • 2021-06-11
      • 2013-09-11
      • 1970-01-01
      • 1970-01-01
      • 2021-04-13
      • 2019-11-21
      • 1970-01-01
      • 1970-01-01
      • 2013-01-27
      相关资源
      最近更新 更多