Я только что провел дополнительное исследование по этой интересной проблеме.
foreach не волнует, если вы сделаете "мой $ y;"до цикла тоже.Итератор по-прежнему будет меняться только в области видимости:
my $y;
foreach $y (1..10) {}
$ y изменится внутри области видимости foreach, но когда он выйдет, он вернется к тому, что было до цикла.
Я думал, что, возможно, foreach автоматически делает «мой $ y»;до его запуска, поэтому я попробовал строгий режим, но это объяснение не сокращает его, потому что тогда оно все равно требует:
foreach my $y (1..10) {}
вместо:
foreach $y (1..10) {}
...что может показаться ненужным, если «foreach $ y» функционально совпадает с «foreach my $ y».