I guess because undef in an integer context will be taken as '0' (albeit with a warning if you have asked for warnings), whereas -1 is not a valid array index:
That makes some sense. -1 is a valid index though, in normal use - it gives you the last element. But in the code you gave, the -1 indeed makes @b an empty array (I didn't know you could do that). Kind of like a quick way to truncate arrays.