$a = '/etc/init/tree/errrocodr/a.txt'
我想提取/etc/init/tree/errrocodr/
至$dir
和a.txt
至$file
。我怎樣才能做到這一點?如何將完整路徑分隔爲目錄和文件名?
(編者注:原題假設你需要一個正則表達式。)
$a = '/etc/init/tree/errrocodr/a.txt'
我想提取/etc/init/tree/errrocodr/
至$dir
和a.txt
至$file
。我怎樣才能做到這一點?如何將完整路徑分隔爲目錄和文件名?
(編者注:原題假設你需要一個正則表達式。)
只需使用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
或者,查看File :: Spec-> splitpath(),它也將音量分開(如果您恰好在具有此類事物的平臺上)。這兩種包裝的優點是它們標準且便於攜帶。 – 2010-08-18 16:27:25
你不需要爲這個正則表達式,你可以使用目錄名():
use File::Basename;
my $dir = dirname($a)
但是這個表達式將工作:
my $dir = $a
$dir =~ s/(.*)\/.*$/$1/
+1,但恕我直言不應該在你的例子中使用變量'$ a',即使OP錯誤地做了。它用於'sort' – dawg 2010-08-18 18:50:50
也許這將工作:
@^(.+/)/([^/]+)[email protected]
例如:
$a =~ m#^(.*?)([^/]*)$#;
($dir,$file) = ($1,$2);
但是,作爲其他sa身份證,最好只使用Basename
。
而且,BTW最好避免$a
和$b
作爲變量名,因爲它們具有特殊含義,用於sort
函數。
我認爲一個正則表達式的解決方案是一個完全合法的需求 - 因爲我的谷歌搜索正是這樣把我帶到了這裏。我想在一個更大的匹配表達式的組中提取文件名 - 這是我的嘗試:
~> 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
試試這個;它至少可以用於文件名,但是當您修改它時,它也會提供方向: 您也可以在UNIX系統上爲\修改它,而不是如果/或在|
$ filename =〜s/(^.*/)// g;
莫名其妙第二前/不顯示反斜槓...
使用@array = split("/", $a);
然後$array[-1]
是你的文件名。
難道你沒有問過這個問題在http://stackoverflow.com/questions/3511214/how-to-support-the-searching-file-based-on-regular-expression?你應該編輯你的原始問題來澄清它,而不是發佈一個新的問題。 – Ether 2010-08-18 16:27:10
@Ether,這是一個完全不同的問題,詢問如何根據通配符獲取文件列表。這更多的是如何將單個文件分割分割爲其各個部分。 – paxdiablo 2010-08-18 21:49:53