1

例程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";
4

2 回答 2

4

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

PS 请记住,@_其中包含传递给函数的参数的别名。所以你也可以使用这个:

sub increment { $_++ for @_ }
increment(@list);
于 2010-11-25T09:41:24.223 回答
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);,但我个人喜欢括号语法。

于 2010-11-25T09:51:25.830 回答