web-dev-qa-db-fra.com

Supprimer l'extension de fichier et le chemin d'une chaîne en 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 supprimer quoi que ce soit avant et y compris le dernier "/" s'il est présent et aussi le dernier "." avec tous les méta caractères après.

Désolé pour une question aussi novice, mais je suis nouveau sur Perl.

29
Chris

Pour obtenir de manière portable le nom de base d'un fichier avec un chemin d'accès complet, je recommanderais File::Basename module, qui fait partie du noyau.

Pour faire de l'heuristique sur les extensions de fichier, j'opterais pour une expression régulière comme

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

Bien que d'autres aient répondu, après avoir lu un peu le nom de base par 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 sur une seule ligne.

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

18
Chris

En supposant que le séparateur de chemin est '/', vous pouvez le faire avec une paire de substitutions :

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

Vous pouvez également écrire cela comme une seule substitution:

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