use Data::Dumper; $_ = 'command1 --max-size=2M a=ignore =ignore --switch --type="some value" --x= --z=1'; my %args; while (/((?<=\s--)[a-z\d-]+)(?:="?|(?=\s))((?{$1} = $2; } print Dumper($args);