Usuń rozszerzenie pliku i ścieżkę z ciągu znaków w Perlu

Chcę uzyskać nazwę pliku bez jego ścieżki (jeśli jest częścią łańcucha), a także rozszerzenie.

Na przykład:

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

Więc w zasadzie, chcę usunąć wszystko przed i włącznie z ostatnim"/", jeśli obecny, a także ostatni"."wraz z wszelkimi meta znakami po nim.

Przepraszam za takie pytanie nowicjusza, ale jestem nowy w Perlu.

Author: Eugene Yarmash, 2010-09-08

3 answers

Do przenoszenia nazwy bazowej pliku z pełną ścieżką, polecamFile::Basename moduł, który jest częścią rdzenia.

Aby zrobić heurystykę na rozszerzeniach plików, wybrałbym Wyrażenie regularne typu

(my $without_extension = $basename) =~ s/\.[^.]+$//;
 37
Author: rafl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-07 13:18:09

Chociaż inni odpowiedzieli, po przeczytaniu trochę na basename na odpowiedź rafla:

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

Wydaje się rozwiązywać problem w jednej linii.

Czy są z tym jakieś problemy, w przeciwieństwie do innych rozwiązań?
 16
Author: Chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-08 13:03:10

Możesz to zrobić za pomocą prostych podstawników:

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

Ten przykład zakłada, że {[1] } jest separatorem ścieżek.

 14
Author: Eugene Yarmash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-08 13:54:29