“将参数传递给子例程” - 问题?
问题描述:
常规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);
答
如果你担心使语法看起来不错,试试这个:
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);
,但我喜欢的支架语法个人。
+1但我的答案(原型为`(\ @)`)也可能很有用(如果函数稍后需要更多参数)。 – 2010-11-25 09:52:50
我有这个已经整理出来,因为它有点慢。 – 2010-11-25 10:12:37