我想在一行中匹配并分配一个变量:
my $abspath='/var/ftp/path/to/file.txt';
$abspath =~ #/var/ftp/(.*)$#;
my $relpath=$1;
我确信这一定很容易。
答案 0 :(得分:18)
my ($relpath) = $abspath =~ m#/var/ftp/(.*)$#;
在列表上下文中,匹配返回组的值。
答案 1 :(得分:15)
强制性Clippy:“嗨!我看到你在Perl中进行路径操作。你想改用Path::Class吗?”
use Path::Class qw(file);
my $abspath = file '/var/ftp/path/to/file.txt';
my $relpath = $abspath->relative('/var/ftp');
# returns "path/to/file.txt" in string context
答案 2 :(得分:9)
您可以使用匹配和替换运算符来完成它:
(my $relpath = $abspath ) =~ s#/var/ftp/(.*)#$1# ;
此代码将$abspath
分配给$relpath
,然后在其上应用正则表达式。
编辑:如果您只需要简单的匹配,Qtax的答案会更优雅。如果您需要复杂的替换(我通常需要),只需使用我的表达式。
答案 3 :(得分:5)
使用Perl 5.14,您还可以使用/r
(非破坏性替换)修饰符:
perl -E'my $abspath="/var/ftp/path/to/file.txt"; \
my $relpath= $abspath=~ s{/var/ftp/}{}r; \
say "abspath: $abspath - relpath: $relpath"'
有关更多示例,请参阅“New Features of Perl 5.14: Non-destructive Substitution”。
答案 4 :(得分:-1)
由于您只想删除字符串的开头,您可以优化表达式:
(my $relpath = $abspath) =~ s#^/var/ftp/##;
甚至:
my $relpath = substr($abspath, 9);