Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何将完整路径分为目录和文件名?_Perl - Fatal编程技术网

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