un ciclo infinito può accadere in genere con while e for, poichè ciclano fino a che la condizione posta è vera, e quindi se per un errore logico del programmatore non si presenta mai il "false" vanno avanti.

invece foreach si gestisce da solo, infatti smette di ciclare nel momento che finiscono gli elementi dell'array, per cui il fatto che un loop abbia un comportamento del genere può essere dovuto solo a due cause:

- gli array sono giganteschi
- da qualche parte del blocco foreach c'è un comando "redo" che fa reiniziare il tutto.

Propendo per la prima ipotesi.

Ti consigli di controllare la dimensione degli array tramite

print $#array1 . "\n";
print $#array2 . "\n";