Может кто-нибудь объяснить этот фрагмент Perl? - PullRequest
0 голосов
/ 05 июня 2018
for my $n (1, 2) {
  sub_example();
}

sub sub_example {
  my $bar = 1 if 1 == 2;
  if ($bar) {
     print "hahha, you see\n";
  }
  else {
     $bar = 1;
  }
}

Итак, мой вопрос: почему $ bar определяется во второй итерации цикла?

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Вы пользуетесь странной ошибкой ( официально устарела и должна стать фатальной ошибкой в ​​5.30), которая включает в себя объявление лексической (my) переменной в выражении с оператором-условный модификатор, который имеет значение false.

Причина, по которой это происходит, заключается в том, что my $bar = 1; в основном имеет две функции.У него есть функция времени компиляции, которая резервирует пространство в лексической панели для переменной и ассоциирует $bar с этим пространством;и он имеет функцию времени выполнения, которая назначает 1 на $bar всякий раз, когда поток управления достигает оператора my (оператор, подобный my $foo; без назначения, также имеет эти два эффекта, за исключением того, что он назначает undef во время выполнения).

Когда вы управляете оператором с помощью ложного условия, такого как my $bar = 1 if 1 == 2;, функция время компиляции остается точно такой же, но время выполнения *Функция 1021 * не может быть запущена с использованием ложного условия, что означает, что любое значение, которое было в этом хранилище, используется повторно без повторного присвоения каждый раз, когда код достигает этой точки.Это дает эффект почти, но не совсем, как при использовании переменной state.Это крутой трюк, но не рекомендуется для любого серьезного использования, и, как я уже упоминал, в последующем выпуске Perl это обречено на провал, что является еще одной причиной не полагаться на него.

0 голосов
/ 05 июня 2018

Вы никогда не должны использовать my с модификатором оператора.Поведение таких конструкций: undefined (см. perlsyn ).

Текущая реализация не очищает значение, присвоенное переменной в предыдущем запуске подпрограммы, но нет никакой гарантии, что поведение останется (на самом деле это не так: см. perldeprecation ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...