Вот еще один способ, которым я могу придумать для достижения этой цели:
sub get_bumper {
my $i = 0;
sub { $i++ };
}
my $bump = get_bumper; # $bump is a closure with its very own counter
map { $_ => $bump->(); } @arr;
Как и многие вещи, которые вы можете делать в Perl: не делайте этого. :) Если последовательность значений, которую нужно назначить, является более сложной (например, 0, 1, 4, 9, 16 ... или последовательность случайных чисел, или чисел, считанных из канала), этот подход легко адаптировать к это, но обычно еще проще просто использовать подход unbeli . Единственное преимущество этого метода состоит в том, что он дает вам хороший чистый способ предоставления и использования произвольных ленивых последовательностей чисел: функция, которая нуждается в последовательности чисел, определенной вызывающим абонентом, может просто принять coderef в качестве параметра и повторно вызывать его для получить номера.