Well it doesn't explicitly break the recursion (it just doesn't recurse anymore, but in the end that's quite the same). I'd say the trick is that grep checks all elements of @_, while your test on $_[0][0] only checks the first array (which happens to be the first to be empty, you're actually lucky that this array was the smallest, with [1,2,3,4,5,6],[1,2],[1,2,3],[1,2,3,4,5] your code might have worked.
And no, map in void context isn't so bad. It's just considered bad practice, often the reason given is that it's wasteful to build a new list (the output of map) just to throw it away, but also most of the time you can replace it by a for loop, which makes the intent clearer (map indicates that you want to transform a list, while for indicates that you want to iterate over it). map {print shift @$_} @_; for example can be translated to print shift @$_ for @_;
In reply to Re^3: understand and prevent 'Out of memory!' during sub recursion
by Eily
in thread understand and prevent 'Out of memory!' during sub recursion
by Discipulus
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |