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