in reply to negative look-ahead is ignored

You can use the "cut" operator in order to prevent backtracking. That way you can stay closer to your original code.
/\d{4}-(?>\d{1,3})(?!-)/
But, you still might want to include that digit in the negative lookahead, or you still can get unexpected matches.
for (qw(2005-12 2005-100 2005-1- 2005-12- 2005-123- 2005-1000)) { printf "%-10s: ", $_; if ( /\d{4}-(?>\d{1,3})(?!-)/ ) { print "yep\n" ; } else { print "nope\n"; } }
Result:
2005-12   : yep
2005-100  : yep
2005-1-   : nope
2005-12-  : nope
2005-123- : nope
2005-1000 : yep
So, better make it
/\d{4}-(?>\d{1,3})(?![\-\d])/
In this case, the cut operator becomes close to useless. Well, it doesn't hurt.

Update I shouldn't post in a hurry. I now see ikegami has posted a post very similar to mine. Duh.