grep just localizes the "current" item in the list to $_ - that's why /regex/ works in grep (and map and for(each) too): you can do any operation you want on $_ and as long as the statement(s) in the grep block return(s) a true value the original value will be in the resulting list (or in the count, if in scalar context).
I guess this is one of the points where perl is intuitive and "deep" at the same time.