Actually, the loop variable will be lexical if there's a current lexical variable with that name, otherwise it will be local variable (with a local scope).
my $i = 10;
our $j = 10;
sub print_it {say "[$i, $j]"}
print_it;
foreach $i (0 .. 5) {print_it;}
print_it;
foreach $j (0 .. 5) {print_it;}
print_it;
__END__
[10, 10]
[10, 10]
[10, 10]
[10, 10]
[10, 10]
[10, 10]
[10, 10]
[10, 10]
[10, 0]
[10, 1]
[10, 2]
[10, 3]
[10, 4]
[10, 5]
[10, 10]
As you can see, $i is lexical, and its value isn't visible outside the loop. But $j is a package variable, who gets a localized value inside the loop. And then its value is visible outside the loop.