如何在一行中将正则表达式匹配的结果分配给新变量?

时间:2011-06-08 11:39:48

标签: regex perl

我想在一行中匹配并分配一个变量:

my $abspath='/var/ftp/path/to/file.txt';

$abspath =~ #/var/ftp/(.*)$#;
my $relpath=$1;

我确信这一定很容易。

5 个答案:

答案 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);