Разверните --$| до $| = $| - 1, и теперь вы можете видеть, что происходит.
Если $| изначально было 1, то --$| изменит значение на 0.
Если $| изначально было 0, то --$| попытается установить значение -1, но на самом деле будет установлено значение 1.
Ответ 2
Ха! $| переворачивается между значениями нуля (false, in perl) и одним (true), когда "predecremented" - он может удерживать только эти значения.
Итак, ваш критерий grep изменяется на каждом проходе, идя true, false, true, false и т.д., и поэтому возвращает все остальные элементы списка.
Слишком умно пополам.
Ответ 3
$| может быть только нулем или одним. Значение по умолчанию - 0, поэтому, уменьшая его до grep, используя 0-й индекс, он будет равен.
Последующие декременты будут фактически "переключать" его с нуля на один на нуль и т.д.
Ответ 4
Дело в том, что это просто неприятный взлом. $| (или его более читаемый псевдоним $OUTPUT_AUTOFLUSH) - это специальные переменные для управления автозапуском STDOUT (или текущей выбранной дескриптор файла). Поэтому он принимает только true (1) или false (0).