如何将完整路径分成目录和文件名?

时间:2010-08-18 13:24:12

标签: perl

$a = '/etc/init/tree/errrocodr/a.txt'

我想将/etc/init/tree/errrocodr/提取到$dir,将a.txt提取到$file。我怎么能这样做?

(编者注:原始问题假定你需要一个正则表达式。)

7 个答案:

答案 0 :(得分: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

答案 1 :(得分:16)

你不需要正则表达式,你可以使用dirname():

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

然而这个正则表达式将起作用:

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

答案 2 :(得分:1)

我认为正则表达式解决方案是一个完全合法的需求 - 因为我的谷歌搜索确实带来了我。我想在一个更大的匹配表达式的组中提取一个文件名 - 这是我的尝试:

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

例如:

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

但是,正如其他人所说,最好只使用Basename

而且,BTW,最好避免使用$a$b作为变量名,因为它们对于sort函数具有特殊含义。

答案 5 :(得分:0)

试试这个;它至少适用于文件名,但是当你修改它时,它也会为你提供方向: 您也可以在UNIX系统上为\修改它,而不是/或者将它们与|

一起使用

$ filename = ~s /(*.*/)//g;

以某种方式显示第二个/之前的反斜杠...

答案 6 :(得分:-2)

也许这会奏效:

@^(.+/)/([^/]+)$@