update: I made the changes that I picked up, and for the moment, I have this. Thanks for the lessons, monks.
All in all looks fine. Only
$_ =~ s/(\d+)/sprintf("%03d",$1)/e;
One good point of using
$_ is that so many built in functions and operators default to it, so that you can write
s/(\d+)/sprintf("%03d",$1)/e;
instead. Now, once you get used to Perl slang, this will become more intuitive and readable than the other way round. OTOH you may have chosen to do
(my $newname=$_) =~ s/(\d+)/sprintf("%03d",$1)/e;
instead.
rename($oldname,$_) unless $oldname eq $_;
Now, this is not
strictly necessary:
touch zizze; perl -le 'rename "zizze", "zizze" or die $!'
Of course it helps to avoid an unnecessary system call. But then again if it is a matter of a quick hack, I wouldn't do it. All in all I don't know if it is convenient efficiency-wise and wether it is or not depends strongly on the actual filenames. One could try to do a benchmark, but I'm not doing it now as my lazyness is currently overwhelming my hubris (BTW: see also
Modules that significantly contribute to Laziness and
Modules that significantly contribute to {Impatience,Hubris} - free ad! ;-)