2010-09-08 12 views
24

Voglio ottenere un nome file senza il suo percorso (se fa parte della stringa) e anche l'estensione.Rimuovere l'estensione del file e il percorso da una stringa in Perl

Ad esempio: ""

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

Quindi, fondamentalmente, voglio togliere nulla prima e compreso l'ultimo "/" se presente e anche l'ultimo insieme a qualsiasi meta personaggio dopo di esso.

Ci scusiamo per una domanda simile a un novizio, ma sono nuovo di perl.

risposta

32

Per ottenere il nome di base di un file con un percorso completo, consigliamo il modulo File::Basename, che fa parte del core.

Per fare euristica su estensioni di file mi piacerebbe andare per un'espressione regolare come

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

Per quanto riguarda basename, ho appena letto: "Questa funzione è fornita per la compatibilità con il comando di shell Unix basename (1). NON restituisce sempre la parte del nome del file di un percorso come ci si potrebbe aspettare. la parte del nome del file di un percorso usa fileparse() ". – Chris

+3

Sì, c'è più di una funzione nel modulo 'File :: Basename', e tutti fanno cose diverse. Scegli quello che fa quello che vuoi. Inoltre, esiste una funzionalità simile in 'File :: Spec' come' splitpath' – rafl

13

si può fare questo con semplici sostituzioni:

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

Questo esempio presuppone che / è il separatore di percorso .

+0

Semplice ed efficace. Grazie. – Andy

15

Anche se altri hanno risposto, dopo aver letto un po 'sul nome di base per la risposta di Rafl:

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

sembra risolvere il problema in una sola riga.

Ci sono problemi relativi a questo, contrari alle altre soluzioni?

Problemi correlati