Perl 如何将完整路径分为目录和文件名?
我想将Perl 如何将完整路径分为目录和文件名?,perl,Perl,我想将/etc/init/tree/errrocodr/提取到$dir和a.txt提取到$file。我该怎么做 (编者按:原来的问题假定您需要一个正则表达式。)只需使用: 您可以看到它返回您请求的结果,但它也能够捕获扩展(在上面的后一节中): 您不需要正则表达式,可以使用dirname(): 但是,此正则表达式将起作用: use File::Basename; my $dir = dirname($a) my $dir = $a $dir =~ s/(.*)\/.*$/$1/ 也许这会奏效:
/etc/init/tree/errrocodr/
提取到$dir
和a.txt
提取到$file
。我该怎么做
(编者按:原来的问题假定您需要一个正则表达式。)只需使用:
您可以看到它返回您请求的结果,但它也能够捕获扩展(在上面的后一节中):
您不需要正则表达式,可以使用dirname(): 但是,此正则表达式将起作用:
use File::Basename;
my $dir = dirname($a)
my $dir = $a
$dir =~ s/(.*)\/.*$/$1/
也许这会奏效:
use File::Basename;
my $dir = dirname($a)
my $dir = $a
$dir =~ s/(.*)\/.*$/$1/
例如:
@^(.+/)/([^/]+)$@
但是,正如其他人所说,最好只使用Basename
顺便说一句,最好避免将
$a
和$b
作为变量名,因为它们对于排序
函数有着特殊的意义。我认为正则表达式解决方案是一个完全合理的需求,因为我在谷歌上搜索的正是这一点让我来到了这里。我想从属于较大匹配表达式一部分的组中提取文件名-以下是我的尝试:
$a =~ m#^(.*?)([^/]*)$#;
($dir,$file) = ($1,$2);
~>echo”/a/b/c/d“| perl-ne'/(?\/(\w+\/)*)(?\w+/&&print“dir$+{dir}file$+{file}\n”;'
目录/a/b/c/文件d
试试这个;它至少适用于文件名,但当您修改它时,它还为您提供了方向:
您还可以在UNIX系统上对其进行修改,以用于\而不是if/或将它们与一起使用|
$filename=~s/(^.*/)///g
不知何故,第二个/之前的反斜杠没有显示…使用@array=split(“/”,$a)代码>
然后,$array[-1]
是您的文件名。您不是已经在问过这个问题了吗?你应该编辑你原来的问题来澄清它,而不是发布一个新的问题。@Ether,这是一个完全不同的问题,询问如何获得基于通配符的文件列表。这篇文章介绍了如何将单个filespec拆分为多个部分。或者,也可以看一看File::Spec->splitpath(),它也可以将卷分隔开(如果您碰巧在一个有这样一个功能的平台上)。这两个包的优点都是标准的和可移植的。+1,但是IMHO不应该在您的示例中使用变量$a
,即使OP错误地使用了该变量。它用于排序
$a =~ m#^(.*?)([^/]*)$#;
($dir,$file) = ($1,$2);
~> echo "/a/b/c/d" | perl -ne '/(?<dir>\/(\w+\/)*)(?<file>\w+)/ && print "dir $+{dir} file $+{file}\n";'
dir /a/b/c/ file d