繁体   English   中英

Perl s /../../无法正常工作

[英]Perl s/../../ not working as expected

代码有点复杂,但是我简化了一点。 我知道我可以轻松做到这一点:

$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。 这是一台服务器,几乎是我坚持使用的版本。

大概应该是这个

s#^.*(?:branches/.+?/|trunk)/##;

因为,相反,它是单个替换,其中^.*不存在
第二轮交替(匹配的轮换)。

   ^ .* 
   ( branches/ .+? / )
|  
   ( trunk )

编辑:扩展了新的正则表达式解释

 ^                       # Beginning of string anchor
 .*                      # Optional match as many as possible non-newline character until ..
 (?:                     # Start non-capture grouping
      branches/ .+? /        # 'branches' plus '/' plus 1 or more chars plus '/'
   |  trunk                  # Or, 'trunk'
 )                       # End grouping

与您的原始正则表达式等效的是

   ^ .* 
   ( branches/ .+? / )
|  
   ^ .* 
   ( trunk )

我想你自己回答了这个问题。 | 运算符的优先级最低,因此可以添加括号。

David,也许我在这里错过了一些东西,但是除了将所有内容替换为您想要的最后一部分之外,为什么不捕获最后一部分呢?

use strict;
use warnings;

my $svn_module = "http://svn.vegicorp.net/svn/trunk/SessionController";
my ($end_module) = $svn_module =~ /([^\/]+)$/;
print $end_module;

输出:

SessionController

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM