замыканиям на perl и $ _

Одна из первых вещей, которую я пытаюсь изучить на незнакомом языке программирования, - это то, как он обрабатывает замыкания. Их семантика часто переплетается с тем, как язык обрабатывает области и различные другие хитрые элементы, поэтому их понимание раскрывает несколько других аспектов языка. Кроме того, замыкания - это действительно мощная конструкция, которая часто сокращает количество шаблонов, которые мне приходится печатать. Итак, я возился с закрытием Perl и наткнулся на небольшую ошибку:

my @closures;
foreach (1..3) {
  # create some closures
  push @closures, sub { say "I will remember $_"; };
}
foreach (@closures) {
  # call the closures to see what they remember
  # the result is not obvious
  &{$_}();
}

Когда я писал приведенный выше код, я ожидал увидеть

I will remember 1
I will remember 2
I will remember 3

, но вместо этого я получил Я запомню CODE (0x986c1f0) .

Вышеупомянутый эксперимент показал, что $ _ очень зависит от контекста, и если он появляется в закрытии, то его значение не фиксируется в момент создания закрытия. Это больше похоже на ссылку. Какие еще подводные камни мне следует знать при создании замыканий в perl?

16
задан Brad Mace 5 July 2011 в 19:10
поделиться