Reputation: 12078
I want to obtain a file name without its path (if it is part of the string) and also the extension.
For example:
/path/to/file/fileName.txt # results in "fileName"
fileName.txt # results in "fileName"
/path/to/file/file.with.periods.txt # results in "file.with.periods"
So basically, I want to remove anything before and including the last "/" if present and also the last "." along with any meta characters after it.
Sorry for such a novice question, but I am new to perl.
Upvotes: 38
Views: 76329
Reputation: 149796
Assuming that the path separator is '/'
, you can do it with a pair of substitutions:
$name =~ s{^.*/}{}; # remove the leading path
$name =~ s{\.[^.]+$}{}; # remove the extension
You can also write that as a single substitution:
$name =~ s{^.*/|\.[^.]+$}{}g;
Upvotes: 19
Reputation: 12341
For portably getting the basename of a file given a full path, I'd recommend the File::Basename
module, which is part of the core.
To do heuristics on file extensions I'd go for a regular expression like
(my $without_extension = $basename) =~ s/\.[^.]+$//;
Upvotes: 44
Reputation: 12078
Although others have responded, after reading a bit on basename per rafl's answer:
($file,$dir,$ext) = fileparse($fullname, qr/\.[^.]*/);
# dir="/usr/local/src/" file="perl-5.6.1.tar" ext=".gz"
Seems to solve the problem in one line.
Are there any problems related with this, opposed to the other solutions?
Upvotes: 24