例程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";
答案 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);
,但我个人更喜欢括号语法。