【发布时间】:2011-06-08 11:39:47
【问题描述】:
我想在一行中匹配并分配给一个变量:
my $abspath='/var/ftp/path/to/file.txt';
$abspath =~ #/var/ftp/(.*)$#;
my $relpath=$1;
我相信这一定很容易。
【问题讨论】:
-
just one line- 有什么特殊原因吗?您知道在捕获不可为空的模式时,单行不是最佳选择。
我想在一行中匹配并分配给一个变量:
my $abspath='/var/ftp/path/to/file.txt';
$abspath =~ #/var/ftp/(.*)$#;
my $relpath=$1;
我相信这一定很容易。
【问题讨论】:
just one line - 有什么特殊原因吗?您知道在捕获不可为空的模式时,单行不是最佳选择。
my ($relpath) = $abspath =~ m#/var/ftp/(.*)$#;
在列表上下文中,匹配返回组的值。
【讨论】:
强制 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
【讨论】:
您可以使用匹配和替换运算符来完成它:
(my $relpath = $abspath ) =~ s#/var/ftp/(.*)#$1# ;
此代码将$abspath 分配给$relpath,然后对其应用正则表达式。
编辑:如果您只需要简单的匹配,Qtax 答案会更优雅。如果您需要复杂的替换(我通常需要),只需使用我的表达式即可。
【讨论】:
在 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”。
【讨论】:
由于您只想删除字符串的开头,您可以优化表达式:
(my $relpath = $abspath) =~ s#^/var/ftp/##;
甚至:
my $relpath = substr($abspath, 9);
【讨论】: