2010-09-08 10 views
24

Quiero obtener un nombre de archivo sin su ruta (si es parte de la cadena) y también la extensión.Eliminar la extensión de archivo y la ruta de una cadena en Perl

Por ejemplo:

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

Así que, básicamente, quiero quitar nada antes e incluyendo el último "/" si está presente y también el último "" junto con cualquier metacaracteres después de él.

Lo siento por una pregunta tan novato, pero soy nuevo en Perl.

Respuesta

32

Para obtener portables el nombre de un archivo dado un camino completo, recomendaría el módulo File::Basename, que es parte del núcleo.

Para hacer heurísticas sobre las extensiones de archivo que volvería para una expresión regular como

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

En cuanto a basename acabo de leer: "Esta función se proporciona para la compatibilidad con el nombre de archivo de comando de shell de Unix (1). NO siempre devuelve la parte de nombre de archivo de una ruta como es de esperar. Para estar seguro, si lo desea la parte del nombre de archivo de una ruta usa fileparse() ". – Chris

+3

Sí, hay más de una función en el módulo 'File :: Basename', y todas hacen cosas diferentes. Elija el que hace lo que quiere. Además, existe una funcionalidad similar en 'File :: Spec' como' splitpath' – rafl

13

Puede hacer esto con sustituciones simples:

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

Este ejemplo asume que / es el separador de ruta .

+0

Simple y efectiva. Gracias. – Andy

15

Aunque otros han respondido, después de leer un poco en nombre base por la respuesta de rafl:

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

parece resolver el problema en una línea.

¿Hay algún problema relacionado con esto, a diferencia de las otras soluciones?

Cuestiones relacionadas