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

问题描述:

常规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"; 

如果它适合你,那么也可以。但是第一个子可以为你传递给它的任何数组完成工作,这使得它更通用。

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

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

+1但我的答案(原型为`(\ @)`)也可能很有用(如果函数稍后需要更多参数)。 – 2010-11-25 09:52:50

+0

我有这个已经整理出来,因为它有点慢。 – 2010-11-25 10:12:37

如果你担心使语法看起来不错,试试这个:

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);,但我喜欢的支架语法个人。