последний оператор perl и область видимости переменной - PullRequest
0 голосов
/ 27 февраля 2019

Должна быть простая конструкция Perl ведет себя не так, как я ожидаю.

Массив @closest содержит строки вида "NNN-NNN".Я пытаюсь найти первый элемент массива, в котором начальный NNN соответствует определенному значению.

Поскольку я объявил $compoundKey вне цикла, я ожидаю, что он будет постоянным.Цикл ведет себя, как и ожидалось, выходя, когда я получаю совпадение.Однако после выхода кода из цикла переменная $compoundKey становится пустой.(См. Вывод журнала после кода. Я ищу "83". Соответствующий элемент не является последним элементом в массиве.)

    my $compoundKey;
    foreach $compoundKey (@closest)
    {
        logentry("In loop compoundKey is $compoundKey\n");
        last if ($compoundKey =~ /^$RID/);   
    }
    logentry("Outside loop compoundKey is $compoundKey\n");

Файл журнала:

    2019-02-27 18:15:26: In loop compoundKey is 90-1287
    2019-02-27 18:15:26: In loop compoundKey is 86-1223
    2019-02-27 18:15:26: In loop compoundKey is 86-1235
    2019-02-27 18:15:26: In loop compoundKey is 87-1316
    2019-02-27 18:15:26: In loop compoundKey is 89-1219
    2019-02-27 18:15:26: In loop compoundKey is 83-1224
    2019-02-27 18:15:26: Outside loop compoundKey is 

Iпредположим, что я могу это исправить, выполнив явное присвоение временной переменной цикла $compoundKey, но я все еще несколько озадачен.Есть ли какая-то ошибка в моем коде, которую я не вижу?Или «последнее» выражение в Perl ведет себя совершенно иначе, чем «break» в C или Java?

Спасибо!

1 Ответ

0 голосов
/ 27 февраля 2019

Это не оператор last, , это оператор foreach .

Цикл foreach перебирает обычное значение списка и задает скалярную переменную VAR равнойкаждый элемент списка по очереди.Если переменной предшествует ключевое слово my, то она имеет лексическую область видимости и поэтому видна только внутри цикла. В противном случае переменная неявно является локальной для цикла и восстанавливает свое прежнее значение при выходе из цикла. Если переменная была ранее объявлена ​​с помощью my, она использует эту переменную вместо глобальной, но все равно локализуется впетля.Эта неявная локализация происходит только в цикле foreach.(Акцент добавлен).

...