sub process_files ($ext, @files) { # let's say we split @files in two sets my @foo_files = ...; my @bar_files = ...; # but part of the processing is the same my $new_name = sub ($name, $some_param) { ... # some longer/complex code to munge the filename # note how this uses at least one var from the outer scope return $new_filename . $ext; }; # different processing for the two sets for my $file (@foo_files) { my $fn = $new_name->($file, "foo"); ... } for my $file (@bar_files) { my $fn = $new_name->($file, "bar"); ... } }