Значение автоинкремента

Выборка значения может быть совмещена с изменением переменной. Если поставить оператор ++ перед именем переменной, то переменная сначала увеличивается, а затем происходит выборка ее значения. Эта форма называется префиксным инкрементом:

my $m = 5;
my $n = ++$m; # увеличить $m до 6, сохранить полученное значение в $n

Если поставить перед переменной оператор --, то переменная сначала уменьшится, а затем ее значение будет использовано в программе (префиксный декремент):
my $c = --$m; # Уменьшить $m до 5, сохранить полученное значение в $c А теперь хитрый момент: в другой разновидности синтаксиса имя переменной ставится в начале выражения (выборка), а за ним идет оператор инкремента или декремента. Эта форма называется постфиксным инкрементом или постфиксным декрементом:

my $d = $m++; # В $d сохраняется старое значение (5), затем $m
# увеличивается до 6
my $e = $m--; # В $e сохраняется старое значение (6), затем $m
# уменьшается до 5

Хитрость в том, что мы выполняем две операции одновременно. Выборка значения совмещается с его изменением в том же выражении. Если на первом месте стоит оператор, переменная сначала увеличивается (или уменьшается), а затем используется ее новое значение.


Если на первом месте стоит переменная, выражение сначала возвращает ее (старое) значение, а потом увеличивает или уменьшает его. Также можно сказать, что эти операторы возвращают значение, но имеют побочный эффект в виде изменения значения переменной. Если выражение записано само по себе1, а его значение не используется (только побочный эффект), от размещения оператора до или после переменной ничего не изменится:

$bedrock++; # Увеличить $bedrock на 1
++$bedrock; # То же самое; увеличить $bedrock на 1
Эти операторы часто используются при работе с хешами для идентиQ
фикации встречавшихся ранее значений:
my @people = qw{ fred barney bamm-bamm wilma dino barney betty pebbles };
my %seen;
foreach (@people) {
print "I've seen you somewhere before, $_!\n"
if $seen{$_}++;
}

Когда barney встречается впервые, выражение $seen{$_}++ ложно, так как оно равно $seen{$_}, то есть $seen{"barney"}, а значение этого элемента хеша равно undef. Однако у выражения имеется побочный эффект в виде увеличения $seen{"barney"}. Когда barney встретится в следующий раз, значение $seen{"barney"} будет истинным, поэтому сообщение будет выведено.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Perl на эту тему:
Автоинкремент и автодекремент
Значение ускоренного логического оператора
Логические операторы
Метки блоков
Модификаторы выражений