Заимствуя термин «Javascript», каков «лучший метод» для IIFE в perl?
Мой тестовый код, приведенный ниже, представляет собой простой цикл, вызывающий анонимную подпрограмму и выполняющий ее сразу же для создания массиваподпрограмм (которые просто возвращают индекс цикла).Это в основном то, что я хочу, однако мне нужно использовать промежуточную переменную (вместо использования @_, которая изменяется во внутренней функции).
use warnings;
use strict;
my @funcs;
for(my $i=0;$i<3;$i++) {
sub {
my $index=shift;
$funcs[$index]=sub {$index};
}
-> ($i);
}
for (@funcs) {
print &$_()."\n";
}
#Output
0
1
2
Я знаю, что могу использовать map
чтобы реструктурировать эту проблему.Но если оставить это в стороне, есть ли лучший способ сделать это?
Обновление
Спасибо @ikegami за выделение некоторых важных моментов.
Простодля будущих взглядов на этот вопрос, мои мысли об этом:
'Итератор' для цикла имеет другую область видимости (это карта?), чем 'стиль c' для цикла.Это очищает код без необходимости IIFE вообще.Sweet.
Обновление 2
Следующий код показывает различия, которые я вижу.Я не говорю, что одно лучше другого, но приятно знать.Вывод, который я ищу, равен 0 1 2, но первый повторяет только последнее значение $ i (3 после оператора ++).
use warnings;
use strict;
my @funcs;
print "C loop direct assignment of sub\n";
for(my $i=0;$i<3;$i++) {
$funcs[$i]= sub {$i};
}
print &$_()."\n" for @funcs;
print "C loop direct assignment of sub with variable\n";
for(my $i=0;$i<3;$i++) {
my $index=$i; #assignment/copy
$funcs[$index]= sub {$index};
}
print &$_()."\n" for @funcs;
print "For loop interator\n";
@funcs=[];
for my $i (0..2) {
$funcs[$i]=sub {$i};
}
print &$_()."\n" for @funcs;
print "C loop with IIFE assignment\n";
@funcs=[];
for (my $i=0;$i<3;$i++) {
sub {
my $index=shift;
$funcs[$index]=sub {$index};
}
-> ($i);
}
print &$_()."\n" for @funcs;
Выход:
C loop direct assignment of sub
3
3
3
C loop direct assignment of sub with variable
0
1
2
For loop interator
0
1
2
C loop with IIFE assignment
0
1
2