该代码有点复杂,但我简化了一下。我知道我可以很容易地做到这一点:Perl s /../../不按预期工作
$svn_module s#.*/##;
并拉出模块的结束。但令人奇怪的是怎么回事:
#! /usr/bin/env perl
use strict;
use warnings;
my $svn_module = "http://svn.vegicorp.net/svn/trunk/SessionController";
print qq(DEBUG: svn_module = "$svn_module"\n);
$svn_module =~ s#^.*(branches/.+?/)|(trunk)/##;
print qq(DEBUG: svn_module = "$svn_module"\n);
此打印:
DEBUG: svn_module = "http://svn.vegicorp.net/svn/trunk/SessionController"
DEBUG: svn_module = "http://svn.vegicorp.net/svn/SessionController"
不过,我期待:
DEBUG: svn_module = "http://svn.vegicorp.net/svn/trunk/SessionController"
DEBUG: svn_module = "SessionController"
为什么我的替换表达式删除trunk/
,但不休息的字符串高达trunk/
?
顺便说一句,增加一个额外的括号的帮助:
$svn_module =~ s#^.*((branches/.+?/)|(trunk))/##;
会工作。
顺便说一下,这是Perl 5.8.8。这是一个服务器,几乎是我所坚持的版本。
好的,我不确定你是否回答了我的问题。显然,额外的一组或括号是有效的。但是,在阅读你的答案后,我想我明白了。我说基本上我是匹配'^。* branches /.+?/'或'trunk'。不像我想的那样,我从一开始就匹配整个字符串到'trunk'。 –
@DavidW。正确 – ysth