sub foo { if (defined wantarray) { # we're in scalar or list context my @param = @_; # make a copy of the parameters foo( @param ); # recursive call for ease of maintenance return @param; # return the result } # we only get here if in void context # do what you need to do on @_ directly, only thing to maintain } #foo #### foo( @data ); #### @newdata = foo( @olddata ); #### @data = foo( qw(foo bar baz) );