By short, are you really meaning fast, or do you just mean
fewest characters? If you want speed, try using
non-capturing parenthesis (?:expression) -- it'll save
perl some effort and make your search faster.
For an even number of ones, I'd actually go with
$foo =~ tr/0//d;
length($foo);
and handle an odd number similarly. It's not a regex, but
it should do the job, and it's very short.
If you really want to do a regex, try
/^(?:0*10*1)*/ # Matches evens
/^0*1(?:0*10*1)*/ # Odds
As you can see, I think your one to match evens is good.