2010-08-18 89 views
14
$a = '/etc/init/tree/errrocodr/a.txt' 

我想提取/etc/init/tree/errrocodr/$dira.txt$file。我怎樣才能做到這一點?如何將完整路徑分隔爲目錄和文件名?

(編者注:原題假設你需要一個正則表達式。)

+0

難道你沒有問過這個問題在http://stackoverflow.com/questions/3511214/how-to-support-the-searching-file-based-on-regular-expression?你應該編輯你的原始問題來澄清它,而不是發佈一個新的問題。 – Ether 2010-08-18 16:27:10

+0

@Ether,這是一個完全不同的問題,詢問如何根據通配符獲取文件列表。這更多的是如何將單個文件分割分割爲其各個部分。 – paxdiablo 2010-08-18 21:49:53

回答

24

只需使用Basename

use File::Basename; 
$fullspec = "/etc/init/tree/errrocodr/a.txt"; 

my($file, $dir, $ext) = fileparse($fullspec); 
print "Directory: " . $dir . "\n"; 
print "File:  " . $file . "\n"; 
print "Suffix: " . $ext . "\n\n"; 

my($file, $dir, $ext) = fileparse($fullspec, qr/\.[^.]*/); 
print "Directory: " . $dir . "\n"; 
print "File:  " . $file . "\n"; 
print "Suffix: " . $ext . "\n"; 

你可以看到這個返回你所要求的結果,但它的還能夠捕捉延伸部分(在上面的後面部分中):

Directory: /etc/init/tree/errrocodr/ 
File:  a.txt 
Suffix: 

Directory: /etc/init/tree/errrocodr/ 
File:  a 
Suffix: .txt 
+2

或者,查看File :: Spec-> splitpath(),它也將音量分開(如果您恰好在具有此類事物的平臺上)。這兩種包裝的優點是它們標準且便於攜帶。 – 2010-08-18 16:27:25

16

你不需要爲這個正則表達式,你可以使用目錄名():

use File::Basename; 
my $dir = dirname($a) 

但是這個表達式將工作:

my $dir = $a 
$dir =~ s/(.*)\/.*$/$1/ 
+0

+1,但恕我直言不應該在你的例子中使用變量'$ a',即使OP錯誤地做了。它用於'sort' – dawg 2010-08-18 18:50:50

0

例如:

$a =~ m#^(.*?)([^/]*)$#; 
    ($dir,$file) = ($1,$2); 

但是,作爲其他sa身份證,最好只使用Basename

而且,BTW最好避免$a$b作爲變量名,因爲它們具有特殊含義,用於sort函數。

1

我認爲一個正則表達式的解決方案是一個完全合法的需求 - 因爲我的谷歌搜索正是這樣把我帶到了這裏。我想在一個更大的匹配表達式的組中提取文件名 - 這是我的嘗試:

~> echo "https://stackoverflow.com/a/b/c/d" | perl -ne '/(?<dir>\/(\w+\/)*)(?<file>\w+)/ && print "dir $+{dir} file $+{file}\n";' 
dir /a/b/c/ file d 
0

試試這個;它至少可以用於文件名,但是當您修改它時,它也會提供方向: 您也可以在UNIX系統上爲\修改它,而不是如果/或在|

$ filename =〜s/(^.*/)// g;

莫名其妙第二前/不顯示反斜槓...

1

使用@array = split("/", $a); 然後$array[-1]是你的文件名。

相關問題