use strict; use warnings; use 5.010; printf "%s -> %s\n", $_, next_file($_) for qw/a.png z.jpg az.png zaz.png ott.jpg zzz.tiff oi.png/; sub next_file { my ($previous) = @_; my ($name, $ext) = $previous =~ /(.*)\.(.*)/; if ($name !~ tr/ilo/jmp/) { $name = reverse $name; for my $chIdx (0 .. length($name) - 1) { substr($name, $chIdx, 1) =~ tr/abcdefghjkmnpqrstuvwxy/bcdefghjkmnpqrstuvwxyz/ and last; substr($name, $chIdx, 1) = 'a'; } $name = reverse $name; $name = 'a' x (1 + length $name) if $name =~ /^a+$/; } return "$name.$ext"; } #### a.png -> b.png z.jpg -> aa.jpg az.png -> ba.png zaz.png -> zba.png ott.jpg -> ptt.jpg zzz.tiff -> aaaa.tiff oi.png -> pj.png