Perl文件路径匹配

时间:2016-02-10 14:41:38

标签: regex perl

我正在尝试在Perl中剪切目录路径。 这是我的代码

#!/usr/bin/perl
use warnings;
use strict;

my $filespec = "/var/www/grammer/lecture12.mp4";
my $relative = $1 if $filespec =~ m{/var/www(.*)};
print $relative;

输出

/grammer/lecture12.mp4

现在,如果我在路径中没有/var/www,那么只有

my $filespec = "/grammer/lecture12.mp4";

此输出为空白,并显示警告。但我期待这个输出路径/grammer/lecture12.mp4

可能是我匹配路径/var/www/。这就是它没有提供所需输出的原因。或者还有其他错误吗?我只想在regex做。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

您可以像这样使用替换运算符s///。我不知道您打算使用修改后的路径,但是您应该注意到一个前导斜杠意味着它是一个绝对路径,位于文件系统的根目录

#!/usr/bin/perl

use strict;
use warnings 'all';
use v5.14.1;

my $filespec = '/var/www/grammar/lecture12.mp4';
my $relative = $filespec =~ s|^/var/www||r;

say $relative;

输出

/grammar/lecture12.mp4

答案 1 :(得分:0)

你得到警告,因为$ relative仅在$ filespec中有/ var / www时被初始化,这与它是空的相同。

此外,您应该检查$ file_spec是否以/ var / www开头,但不包含在内部。

你也省略了www之后的斜杠,所以你的正则表达式会在像/var/www2/and/so/on.mp4这样的路径上失败

考虑到这一点,你应该改变行

my $relative = $1 if $filespec =~ m{/var/www(.*)};

到以下代码:

$filespec =~ m{^/var/www/(.*)};
my $relative = $1||$filespec;