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.
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/\.[^.]+$//;
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?
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;