sub foo { ($foo_cache{...} ||= do { my @result = do { ... rest of sub goes here } sub { @result[0..$#result] }; }; )->(); } #### my %foo_cache; sub foo { my $index = join ",", @_; $foo_cache{$index} ||= do { .... }; wantarray ? @{$foo_cache{$index} : $foo_cache{$index}[-1]; } #### sub list { wantarray ? @_ : $_[-1]; }