Есть PERL мозгов тизер:Почему Perl for() не просматривает все элементы моего массива?
my @l = ('a', 'b', 'c');
for (@l) {
my $n = 1;
print shift @l while (@l and $n --> 0);
print "\n";
}
Что это печатать? Должны быть a, b и c, так? Но о, подождите, там где-то есть ошибка, она печатает только буквы a и b. Наверное, просто какая-то глупость, должна быть легко решить, не так ли?
ИТАК сделать небольшое изменение кода, чтобы проверить вещи и изменить @l к
my @l = ('a', 'b', 'c', 'd');
Что это печатать? Вероятно, a, b и c из-за этого глупо от одного, не так ли? ... Подождите секунду, на самом деле он все еще печатает только a и b. Хорошо, так что ошибка в том, что она печатает только первые два символа.
Изменить @l снова
my @l = ('a', 'b', 'c', 'd', 'e');
Эмм, теперь печатает, б и в. Но не d или e. Фактически, каждые 2 буквы, которые мы добавим с этого момента, сделают печать следующей буквы в последовательности. Поэтому, если мы добавим f, он все равно будет печатать a, b и c, но если мы добавим f и g, он напечатает a, b, c и d.
Это также происходит с аналогичными результатами для разных значений $ n.
Так что же здесь происходит?
Josh McAdams написал об этом для эффективного Perl Programming, 2nd Edition. Короче говоря, не изменяйте список, который вы повторяете. –
А, мой любимый оператор, '->' ... :) – Ether