$ perl -E 'use File::Basename; say "|$_|" for fileparse("X.tgz", qw{.gz .tgz})' |X.| |./| |tgz| $ perl -E 'use File::Basename; say "|$_|" for fileparse("X.tgz", qw{\.gz \.tgz})' |X| |./| |.tgz| #### $ perl -E 'use File::Basename; say "|$_|" for fileparse("X.tar.gz", qw{\.gz \.tgz \.tar\.gz})' |X.tar| |./| |.gz| $ perl -E 'use File::Basename; say "|$_|" for fileparse("X.tar.gz", qw{\.tgz \.tar\.gz \.gz})' |X| |./| |.tar.gz| #### substr $filename, rindex($filename, ".") + 1 || length $filename #### $ perl -E ' say "oldfile\t ext \tnewfile"; say "-------\t --- \t-------"; my $newname = "edddd"; for (qw{OPQ.RST .U V. .W. X.Y Z . ..}) { my $ext = substr $_, rindex($_, ".") + 1 || length; say "$_\t|$ext|\t$newname" . (length $ext ? ".$ext" : ""); } ' oldfile ext newfile ------- --- ------- OPQ.RST |RST| edddd.RST .U |U| edddd.U V. || edddd .W. || edddd X.Y |Y| edddd.Y Z || edddd . || edddd .. || edddd