代码之家  ›  专栏  ›  技术社区  ›  sid_com

“向子例程传递参数”-问题?

  •  1
  • sid_com  · 技术社区  · 14 年前

    常规2也可以吗?还是我不应该这样做?(子例程中不需要@list的副本)

    #!/usr/bin/perl
    use 5.012;
    use warnings;
    my @list = 0 .. 9;
    
    
    sub routine1 {
        my $list = shift;
        for (@$list) { $_++ };
        return $list
    }
    my $l = routine1( \@list );
    say "@$l";
    
    
    sub routine2 {
        for (@list) { $_++ };
    }
    routine2();
    say "@list";
    
    2 回复  |  直到 14 年前
        1
  •  4
  •   Eugene Yarmash    14 年前

    如果对你有用,那也没关系。但是第一个子函数可以完成传递给它的任何数组的任务,这使得它更通用。

    P.S.记住 @_ 包含传递给函数的参数的别名。所以你也可以用这个:

    sub increment { $_++ for @_ }
    increment(@list);
    
        2
  •  1
  •   Chris Lutz    14 年前

    如果您担心使语法看起来美观,请尝试以下操作:

    sub routine3 (\@) {
      for (@{$_[0]}) { $_++ }
    }
    
    my @list = (0 .. 9);
    routine3(@list);
    say "@list"; # prints 1 .. 10
    

    这表明 routine3 使用原型-它通过引用获取数组参数。所以 $_[0] 是指 @list ,不太难看 \ 打电话的人需要的。(有些人不鼓励原型,所以就照你说的去做吧。)。我喜欢它们。)

    但除非这是对你的日常工作的简化,否则我要做的是:

    my @list = 0 .. 9;
    my @new_list = map { $_ + 1 } @list;
    say "@new_list";
    

    除非 routine 实际上是非常复杂的,而且不管怎么说,修改原始数组是非常重要的,我将使用 map . 尤其是 地图 ,可以插入子例程:

    sub complex_operation { ... }
    
    my @new_list = map { complex_operation($_) } @list;
    

    当然,你可以做原型 complex_operation 具有 (_) 然后就写 map(complex_operation, @list); 但我个人喜欢括号语法。