reverse is a chIdx is 0 a.png -> b.png reverse is z chIdx is 0 z.jpg -> aa.jpg reverse is za chIdx is 0 chIdx is 1 az.png -> ba.png reverse is zaz chIdx is 0 chIdx is 1 zaz.png -> zba.png ott.jpg -> ptt.jpg reverse is zzz chIdx is 0 chIdx is 1 chIdx is 2 zzz.tiff -> aaaa.tiff oi.png -> pj.png reverse is cba chIdx is 0 abc.jpg -> abd.jpg $ #### sub start_magick { 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 abc.jpg/; } sub next_file { use strict; use warnings; use 5.010; my ($previous) = @_; my ( $name, $ext ) = $previous =~ /(.*)\.(.*)/; if ( $name !~ tr/ilo/jmp/ ) { $name = reverse $name; say "reverse is $name"; for my $chIdx ( 0 .. length($name) - 1 ) { say "chIdx is $chIdx"; 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"; }