Если вы беспокоитесь о том, чтобы синтаксис выглядел красиво, попробуйте следующее:
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);
, но мне лично нравится синтаксис скобок.