Actually this isn't exactly the same, because your code has a bug, assuming that your goal is to weed out elements equal to 5. (That's the goal, right? If not, never mind.)my @array = grep $_ != 5, 0..9;
The bug is that you're altering the array while progressing through the loop, which means that you skip certain elements. Try your code on this array:
Only the first 5 will be removed, because after splice-ing out the first 5, the index of the 5 following it has just decreased by 1. But the loop counter increments, and you end up skipping the 5 following it.my @array = qw(0 1 2 3 4 5 5 6 7 8 9 );
As for your general question, which seems to be, is there a way to get rid of reliance on loop counters when iterating through arrays. And that's a good question, and I don't really think there is a good way. There isn't a magic variable for "index into an array" when in a foreach loop. Although perhaps there should be; Dominus has a post about this.
All the same, though, you should probably refrain from altering an array while iterating over it.