从路径中查找示例名称和目录名称

时间:2016-05-31 16:30:22

标签: regex perl

我的脚本从另一个脚本接收文件的完整路径名,我试图在perl中破坏这个完整的路径名,并将此信息传递给我的脚本。

我无法使用拆分提取它,任何人都可以建议如何处理 - 我需要拆分冷看起来的路径 - path = /usr/local/projects/Tool/Work/Section12/Tool.Sample.2.pdf

提取这些值Sample1/usr/local/projects/Tool/Work/,以便我可以使用这些值为我的脚本中的两个变量赋值,例如$Sample_id = Sample$Dir=/usr/local/projects/Tool/Work/

任何人都可以建议吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

您应该使用核心File::Spec::Functions模块,以便您的代码尊重您正在处理的平台的任何怪癖。来自该模块的splitdircatdir分离并重新组合路径组件,使您的任务变得非常简单

我在这里使用splitdir$path的步骤放入数组@path。最后一个元素是我使用pop复制出来的文件名,而倒数第二个是Part12,您似乎并不感兴趣,所以我使用了另一个pop来摆脱那个

然后剩下的就是从$dir_path的左边重建@path,然后提取您感兴趣的文件名部分<\ n / p>

要做到后者,有几种选择,具体取决于你的意思。它可能是在点.上分割的文件名的第二个字段,或者从末尾开始的第三个字段,以相同的方式分割。我已经选择以大写或小写的sample开头的字段。正则表达式为我找到了

use strict;
use warnings 'all';

use File::Spec::Functions qw/ splitdir catdir /;

my $path = 'E:/usr/local/projects/Tool/Work/Part12/Tool.Sample01.2.pdf';

my @path = splitdir $path;

my $file = pop @path;        # Copy and remove the file name from the end
my $local_dir = pop @path;   # Remove `Part12` per requirement

my $dir_path = catdir @path; # Rebuild what is left of the path


# Pick the first subsequence of the file name that starts with `sample`
#
my ($sample) = grep /^sample/i, split /\./, $file;

print "\$sample = $sample\n";
print "\$dir_path = $dir_path\n";

输出

$sample = Sample01
$dir_path = /usr/local/projects/Tool/Work

答案 1 :(得分:0)

这有两个部分 - 分割完整路径,并提取其某些部分的特定组件。通过几个模块可以很好地完成将文件名与完整路径拆分为其组件。在这里,我将使用核心模块File::Basename。然后可以处理路径和文件名以满足特定要求,在这里我将使用正则表达式。

use warnings;
use strict;
use File::Basename qw(fileparse);

my $fullname = '/usr/local/projects/Tool/Work/Section12/Tool.Sample.2.pdf';

# Parse it into the path and filename
my ($filename, $path) = fileparse($fullname);

# Extract needed part of the path: all except last directory
my ($dirs) = $path =~ m|(.*)/.*/|;  # / stop editor coloring

# Extract needed part of filename: between the first `.` and the next
 my ($tag) = $filename =~ /[^.]+\.([^.]+)/;

print "$dirs\n$tag\n";

打印

/usr/local/projects/Tool/Work
Sample

将部分拉出路径和文件名的正则表达式都是特定于任务的。第一个使用的事实是我们只需要删除 路径的最后一个组件,因此.*的贪婪正确。在第二个中,我使用了这个模式介于第一个.和下一个my ($base, $path, $ext) = fileparse($fullname, @suffix_list); 之间的事实。

请注意,在上面的基本调用中,不会提取扩展名,并返回带有扩展名的文件名。感谢Borodin在评论中提出这一点。请参阅文档,因为应始终使用任何建议的模块。

这是使用完整路径时最常见的需求。但是如果你想要扩展分裂,那么传递另一个参数,这可以是一个寻求扩展的列表或正则表达式。然后返回文件名部分,不带扩展名。

@suffix_list

例如,qr/\.[^.]*/可以是my ($base, $path, $ext) = fileparse($fullname, qr/\.[^.]*/); print "$path\n$base\n$ext\n"; ,在这种情况下我们有

$directories . $filename . $suffix

印刷

/usr/local/projects/Tool/Work/Section12/
Tool.Sample.2
.pdf

关于可靠性的说明,来自docs:

  

我们保证$path将表示与原始$scope.a = { name: "mike", age: 10 }; $scope.b = $scope.a; $scope.b.name = "john"; 相同的位置。