$a = '/etc/init/tree/errrocodr/a.txt'
我想将/etc/init/tree/errrocodr/
提取到$dir
,将a.txt
提取到$file
。我怎么能这样做?
(编者注:原始问题假定你需要一个正则表达式。)
答案 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)
也许这会奏效:
@^(.+/)/([^/]+)$@