“将参数传递给子程序”-question?

时间:2010-11-25 09:27:46

标签: perl reference argument-passing subroutine

例程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 个答案:

答案 0 :(得分:4)

如果它适合你,那也没关系。但是第一个sub可以为你传递给它的任何数组做这个工作,这使得它更通用。

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

sub increment { $_++ for @_ }
increment(@list);

答案 1 :(得分:1)

如果您担心语法看起来不错,请尝试以下方法:

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。特别是map,你可以插入一个子程序:

sub complex_operation { ... }

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

当然,您可以使用complex_operation(_)进行原型设计,然后只需编写map(complex_operation, @list);,但我个人更喜欢括号语法。