2014-10-06 4 views
1

Вот мой код Perl:Почему эта лексическая переменная не сохраняет свое значение после цикла?

use strict; 
use warnings; 

my @words = ("alpha", "bravo", "charlie"); 

(my $word = $_) foreach @words; 

print $word; 

Я ожидал бы этот код, чтобы сделать одну из двух вещей:

  1. Печатают строку «чарли», которая является окончательным значением $word после цикла завершено.
  2. Пожаловаться на компиляцию error, так как my $word - лексическая переменная, scope - область foreach; он не существует на последней строке.

Вместо этого, кажется, значение $word является undef и Perl поднимает предупреждение и печатает пустую строку.

Почему?

+1

Я немного удивлен, что 'warnings' или' strict' не жалуются, потому что для меня это выглядит как переменная, которая больше не находится в сфере видимости. – Sobrique

ответ

6

От perldoc perlsyn

ПРИМЕЧАНИЯ: поведение моего, состояния, или нашего модифицированный с модификатором оператора условной или петлевой конструкцией (например, мой $, если х ...) является неопределенными . Значение моей переменной может быть undef, любое ранее присвоенное значение или, возможно, что-либо еще. Не полагайтесь на это. Будущие версии perl могут сделать что-то отличное от версии perl, которую вы попробуете. Здесь будут драконы.

+0

Просьба прокомментировать, когда правильный ответ правильный. –

+0

Но * почему *? Почему Perl не просто объявляет, что 'EXPRESSION foreach LIST' точно синтаксически эквивалентен' foreach (LIST) {EXPRESSION} '? Разве это не было бы бесконечно проще и предсказуемо? – qntm

+2

Потому что это не совсем эквивалентно. Версия с использованием модификатора оператора не создает новую лексическую область и, следовательно, работает заметно быстрее. (И поскольку он не создает новую лексическую область, это также означает, что лексическая переменная не может быть ограничена только этим утверждением.) – tobyink

Смежные вопросы