sub myfunction { my %defs = ( optionA=>2e6, optionB=>'defA', optionC=>'defB' ); my %user = ( %defs, @_ ); my %opts; @opts{keys %defs} = delete @user{keys %defs}; carp "Unknown options: '@{[ %user ]}' ignored." if %user; # %opts user known user supplied options # defaults for unsupplied options # Warning issued about unknown options # do stuff. }