in reply to Getopt::Long return value

I don't think it's a bug.

Here's what's happening: by default, the permute option is set to true (unless your environment variable POSIXLY_CORRECT is set). That means that option values may be mixed with non-option values (like, say, filenames). With this (default) behavior, your -h 1 -c 2 is the same as saying -h -c 2 1. In other words, if you look at @ARGV, you'll see the extra '1' argument.

To turn this default behavior off, just do this:

Getopt::Long::Configure('nopermute');

. That'll make any out-of-order arguments end processing, so that -h 1 -c 2 will be parsed as  -h, and @ARGV will contain 1 -c 2. Of course, to really catch these problems, you'll have to scan @ARGV. If you don't have non-option arguments, a simple test of whether @ARGV is empty after calling GetOptions should suffice.