Удалить расширение файла и путь из строки в Perl

Я хочу получить имя файла без пути (если это является частью строки), а также расширение.

например:

/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" 

таким образом, в основном, я хочу удалить что-либо до и включая последний"/", если присутствует, а также последний ".- вместе с любыми метасимволами после него.

извините за такой вопрос новичка, но я новичок в Perl.

3 ответов


для переносимого получения базового имени файла с полным путем я бы рекомендовал File::Basename модуль, который является частью ядра.

для эвристики расширений файлов я бы пошел на регулярное выражение, такое как

(my $without_extension = $basename) =~ s/\.[^.]+$//;

хотя другие ответили, прочитав немного на basename за ответ рафла:

($file,$dir,$ext) = fileparse($fullname, qr/\.[^.]*/);
# dir="/usr/local/src/" file="perl-5.6.1.tar" ext=".gz"

Кажется, решает проблему в одной строке.

есть ли проблемы, связанные с этим, в отличие от других решений?


Вы можете сделать это с простой замены:

$name =~ s{.*/}{};      # removes path  
$name =~ s{\.[^.]+$}{}; # removes extension

в этом примере предполагается, что / является разделителем пути.