2010-09-08 10 views
24

Yolu olmayan bir dosya adı almak istiyorum (dizenin bir parçasıysa) ve uzantı.Dosya uzantısını ve yolu bir dizgeden kaldır Perl

Örneğin

: ""

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

Yani temelde, daha önce herhangi bir şey kaldırmak istiyor ve dahil son "/" eğer mevcut ve ayrıca son ondan sonra herhangi bir meta karakterle birlikte.

Böyle acemi bir soru için üzgünüm, ama ben perl için yeniyim.

cevap

32

Tam yol verilmiş bir dosyanın basename dosyasını almak için çekirdeğin bir parçası olan File::Basename modülünü öneririm.

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

Bu örnek / yol ayırıcı olduğunu varsayar:

Basit oyuncu değişikliği ile bunu yapabilirsiniz ben

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

Basename ile ilgili olarak şunu okudum: "Bu işlev Unix kabuk komutu basename (1) ile uyumluluk için sağlanır. Her zaman bir yolun dosya adı bölümünü beklediğiniz gibi geri döndürmez. Bir yolun dosya adı kısmı fileparse() kullanır. – Chris

+3

Evet, 'File :: Basename' modülünde birden fazla işlev var ve hepsi farklı şeyler yapıyor. İstediğini yapanı seç. Ayrıca, benzer işlevler 'Dosya :: Özelliği '' splitpath' – rafl

13

gibi bir düzenli ifade için gitmek istediğiniz dosya uzantılarını buluşsal yöntemler yapmak için . Diğerleri tepki vermiş olsa da

+0

Basit ve etkili olarak bulunur. Teşekkürler. – Andy

15

, Rafl en Yanıt başına basename üzerinde biraz okuduktan sonra:

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

tek satırda sorunu çözmek gibi görünüyor.

Diğer çözümlerden farklı olarak bununla ilgili herhangi bir sorun var mı?