my $flag, @args; my %more = ( x => 2, y => 1, z => 0 ); GetOptions( 'x=s' => \&parse_opt, 'y=s' => \&parse_opt, 'z=s' => \&parse_opt, ); sub parse_opt { my ($opt, $val) = @_; # splice additional args off @ARGV based on how many I expect push @args, $val, splice @ARGV, 0, $more{$opt}, (); }