In this case your best bet would be to declare my (@array1, @array2) before the for loop if you want them to be available to your subroutines.
[SNIP]
This clearly tells me that the subroutine is looking for global variables. Declaring them as my inside a loop doesn't create global variables. So moving them to the top, like this, works fine:
OTOH this suggestion,
in this form may contribute to suggest the OP to declare all of his own variables at the top of his scripts, which is indeed a bad habit many newbies have, and goes against proper scoping of variables.
I do use stuff like
{
my $var;
sub bus {
$var++;
}
}
myself, occasionally. But
not as an alternative to parameter passing...