我的脚本从另一个脚本接收文件的完整路径名,我试图在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/
任何人都可以建议吗?
谢谢!
答案 0 :(得分:2)
您应该使用核心File::Spec::Functions
模块,以便您的代码尊重您正在处理的平台的任何怪癖。来自该模块的splitdir
和catdir
分离并重新组合路径组件,使您的任务变得非常简单
我在这里使用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";
相同的位置。