sub subParams { my %parameters = @{shift(@_)}; my @ret = (); while (my ($entry,$default) = splice(@_,0,2)) { if(length $parameters{$entry}) { push(@ret,$parameters{$entry}); } else { push(@ret,$default); } } @ret; } sub sample { my ($p0,$p1) = subParams(\@_,p0=>'d0',p1=>'d1'); } #With the above code, each of these calls are indentical sample(p0=>'d0',p1=>'d1'); sample(p1=>'d1',p0=>'d0'); sample(p0=>'d0'); sample(p1=>'d1'); sample();