Ответ 1
Исследуемое поведение задокументировано в цикле Foreach в Perlsyn
Цикл
foreach
выполняет итерацию по обычному значению списка и устанавливает скалярную переменную VAR в качестве каждого элемента списка по очереди. Если переменной предшествует ключевое словоmy
, то она имеет лексическую область видимости и поэтому видна только внутри цикла.
который продолжает объяснение
В противном случае переменная неявно является локальной для цикла и восстанавливает свое прежнее значение при выходе из цикла. Если переменная была ранее объявлена с помощью
my
, она использует эту переменную вместо глобальной, но она все еще локализована в цикле.
Таким образом, не должно быть никакой разницы между тем, чтобы локализовать это с my
или оставить это для foreach
.
Небольшое любопытство в том, что
Эта неявная локализация происходит только в цикле
foreach
.
Все это дополнительно разъясняется в этом фрагменте из Частных переменных через my()
из perlsub.
Цикл
foreach
умолчанию определяет динамическую область видимости своей индексной переменной способомlocal
. Однако, если переменная индекса имеет префикс с ключевым словомmy
, или если в области уже есть лексическое слово с таким именем, то вместо этого создается новый лексический.
Поскольку внутри обоих случаев создается новая лексика, не может быть никакой практической разницы.
Я абсолютно поддерживаю и рекомендую (всегда) иметь my
там.