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

Tre*_*ree 14 perl

$a = '/etc/init/tree/errrocodr/a.txt'
Run Code Online (Sandbox Code Playgroud)

我想提取 /etc/init/tree/errrocodr/$dira.txt$file.我怎样才能做到这一点?

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

pax*_*blo 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";
Run Code Online (Sandbox Code Playgroud)

您可以看到这返回您请求的结果,但它也能够捕获扩展(在上一节中):

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

Directory: /etc/init/tree/errrocodr/
File:      a
Suffix:    .txt
Run Code Online (Sandbox Code Playgroud)

  • 或者,看一下File :: Spec-> splitpath(),它也会分离出音量(如果你碰巧在一个有这种东西的平台上).这两种包装的优点是它们是标准的和便携的. (2认同)

enn*_*ler 16

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

use File::Basename;
my $dir = dirname($a)
Run Code Online (Sandbox Code Playgroud)

但是这个正则表达式将起作用:

my $dir = $a
$dir =~ s/(.*)\/.*$/$1/
Run Code Online (Sandbox Code Playgroud)