Удалить расширение файла и путь из строки в Perl - PullRequest
29 голосов
/ 08 сентября 2010

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

Например:

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

38 голосов
/ 08 сентября 2010

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

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

(my $without_extension = $basename) =~ s/\.[^.]+$//;
18 голосов
/ 08 сентября 2010

Хотя другие и ответили, после прочтения небольшого количества базовых имен за ответ rafl:

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

Похоже, что проблема решена в одной строке.

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

15 голосов
/ 08 сентября 2010

Предполагая, что разделитель пути равен '/', вы можете сделать это с парой замен :

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

Вы также можете записать это как одну подстановку:

$name =~ s{^.*/|\.[^.]+$}{}g;
...