Подтвердить что ты не робот

Как это сделать - $| работа в Perl?

Недавно я наткнулся на это, чтобы отфильтровать каждое второе значение списка:

perl -E 'say grep --$|, 1..10'
13579

Как это работает?

4b9b3361

Ответ 1

$| - это специальная переменная Perl, которая может иметь только значения 0 и 1. Любое присваивание $| ненулевого значения true, например

$| = 1;
$| = 'foo';
$| = "4asdf";          # 0 + "4asdf" is 4
$| = \@a;

будет иметь значение $|, равное 1. Любое назначение нулевого значения false

$| = 0;
$| = "";
$| = undef;
$| = "erk";            # 0 + "erk" is 0

установит $| в 0.

Разверните --$| до $| = $| - 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).