Вы пользуетесь странной ошибкой ( официально устарела и должна стать фатальной ошибкой в 5.30), которая включает в себя объявление лексической (my
) переменной в выражении с оператором-условный модификатор, который имеет значение false.
Причина, по которой это происходит, заключается в том, что my $bar = 1;
в основном имеет две функции.У него есть функция времени компиляции, которая резервирует пространство в лексической панели для переменной и ассоциирует $bar
с этим пространством;и он имеет функцию времени выполнения, которая назначает 1
на $bar
всякий раз, когда поток управления достигает оператора my
(оператор, подобный my $foo;
без назначения, также имеет эти два эффекта, за исключением того, что он назначает undef
во время выполнения).
Когда вы управляете оператором с помощью ложного условия, такого как my $bar = 1 if 1 == 2;
, функция время компиляции остается точно такой же, но время выполнения *Функция 1021 * не может быть запущена с использованием ложного условия, что означает, что любое значение, которое было в этом хранилище, используется повторно без повторного присвоения каждый раз, когда код достигает этой точки.Это дает эффект почти, но не совсем, как при использовании переменной state
.Это крутой трюк, но не рекомендуется для любого серьезного использования, и, как я уже упоминал, в последующем выпуске Perl это обречено на провал, что является еще одной причиной не полагаться на него.