Supprimer l'extension de fichier et le chemin d'une chaîne de caractères dans Perl

je veux obtenir un nom de fichier sans son chemin (s'il fait partie de la chaîne) et aussi l'extension.

Par exemple:

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

donc fondamentalement, je veux enlever n'importe quoi avant et incluant le dernier "/" si présent et aussi le dernier "."avec des méta-caractères après.

Désolé pour un novice question, mais je suis nouveau sur perl.

27
demandé sur Eugene Yarmash 2010-09-08 16:47:41

3 réponses

pour obtenir le nom de base d'un fichier avec un chemin complet, je recommande le File::Basename module, qui fait partie du noyau.

Pour faire des heuristiques sur les extensions de fichier, j'irais pour une expression régulière comme

(my $without_extension = $basename) =~ s/\.[^.]+$//;
37
répondu rafl 2013-10-07 13:18:09

bien que d'autres aient répondu, après avoir lu un peu sur basename la réponse de rafl:

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

Semble résoudre le problème en une seule ligne.

Existe-t-il des problèmes liés à cela, contrairement aux autres solutions?

16
répondu Chris 2010-09-08 13:03:10

Vous pouvez le faire avec de simples substitutions:

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

Cet exemple suppose que / est le séparateur de chemin.

14
répondu Eugene Yarmash 2010-09-08 13:54:29