my ($re, $fmt) = @ARGV; function reformat { local $_ = $fmt; s/%(?:(\d+)|.)/$_[$1] if defined $1/ge; return $_; } # ... $re = qr/$re/; # precompile for(@list_of_files) { next unless (my @capture = /$re/); rename $_, reformat(@capture); }