Это общий шаблон в Perl для создания массива, состоящего из «уникальных» элементов в данном массиве.
В Perl хеш хранит значение, связанное с любым заданным ключом. Если вы ничего не поместили в хеш для данного ключа, вы получите undef
- но в числовом контексте, например, когда вы выполняете операцию увеличения, undef
обрабатывается как 0
а затем увеличивается.
Оператор if
проверяет истинные или ложные значения, как вы знаете. В Perl 0
, "0"
, ''
(пустая строка) и undef
(и, возможно, другие?) Рассматриваются как ложные значения.
Постинкремент, как и в C / C ++ / Java, возвращает исходное значение содержащемуся выражению. Итак, этот код
if ( $seen{ $elem }++ ) {
next;
}
вернет false (0
) для элемента, который еще не был просмотрен, и цикл продолжится (то есть оператор next
не будет выполняться). Элемент будет помещен в массив. Однако, прежде чем это произойдет, приращение происходит - теперь внезапно 1
сохраняется в хэше, что означает, что значение было просмотрено один раз. В следующий раз, когда это значение будет замечено, цикл будет пропущен, и значение больше не будет добавлено в массив результатов.