Подтвердить что ты не робот

Удалить расширение файла и путь из строки в 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.

4b9b3361

Ответ 1

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

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

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

Ответ 2

Хотя другие ответили, после чтения бит в basename за rafl ответ:

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

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

Существуют ли какие-либо проблемы, связанные с этим, против других решений?

Ответ 3

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

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

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

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