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

ava*_*123 9 regex perl

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

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

$abspath =~ #/var/ftp/(.*)$#;
my $relpath=$1;
Run Code Online (Sandbox Code Playgroud)

我相信一定很容易.

Qta*_*tax 17

my ($relpath) = $abspath =~ m#/var/ftp/(.*)$#;
Run Code Online (Sandbox Code Playgroud)

在列表上下文中,匹配返回组的值.


dax*_*xim 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
Run Code Online (Sandbox Code Playgroud)


Fra*_*o R 9

您可以使用匹配和替换运算符来完成它:

(my $relpath = $abspath ) =~ s#/var/ftp/(.*)#$1# ;
Run Code Online (Sandbox Code Playgroud)

此代码分配$abspath$relpath然后在其上应用正则表达式.

编辑:如果您只需要简单的匹配,Qtax答案会更优雅.如果您需要复杂的替换(我通常需要),只需使用我的表达式.


mir*_*rod 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"'
Run Code Online (Sandbox Code Playgroud)

有关更多示例,请参阅" Perl 5.14的新功能:非破坏性替换 ".