You could feed your examples to the following program and see what happens...
The important part is the "o=s" telling Getopt to look for -o switches with a string argument and the array-ref telling it
to accumulate the -o arguments into an array.
use strict;
use warnings;
use Getopt::Long;
my @o_list;
unless ( GetOptions ("o=s" => \@o_list) ) {
print "GetOptions had problems parsing ARGV!\n";
}
print "List of -o things: ", join(", ", @o_list), "\n";
print "Unparsed arguments: ", join(", ", @ARGV ), "\n";