#!/usr/local/bin/perl;
use strict;
use warnings;
my $stg = "varun.kumar.ms.sri";
# Find the first dot. A global match in Boolean context finds them one
# at a time. We exit after the first, leaving the match position just
# after the first dot.
while ( $stg =~ m/\./g ) { last };
# Do the replacement on the substring that begins after the first dot.
# Since substr() is an lvalue subroutine, the underlying string gets
# modified.
substr( $stg, pos $stg ) =~ s/\./.x/g;
print "$stg\n"; # prints 'varun.kumar.xms.xsri'
6条答案
按热度按时间6vl6ewon1#
首先,你的替换操作符使用了不正确的语法。不应该在
s///
周围使用单引号,而且/2
不是一个可识别的修饰符。第二,我不知道在一个正则表达式中有什么方法可以做到这一点。但是,有一种方法可以通过将字符串分成2部分,然后只在第2部分进行替换:
图纸:
这将基于第一个
.
将字符串拆分为2部分,使用splitLIMIT为2。然后它在第二块中全局替换所有.
为.x
。最后,它重建完整的字符串。fruv7luv2#
也可以使用 *SKIP动词
用于就绪测试的命令行程序
上面的是“from second occurrence”--如果可以改变的话,添加一个量词
o2gm4chl3#
完全包含在替换中的解决方案:
oug3syen4#
如果你要像前面的答案建议的那样使用
split
,那么你也可以使用以下代码:额外的好处:与toolic的解决方案不同,如果字符串不包含
.
,这个解决方案不会发出警告和失败。aiqt4smr5#
另一个不做拆分的解决方案:
zmeyuzjn6#
要在一个 regex 中的第三个单词之前插入一个字符(x),您可以使用:用途:
s/^(\w+\.\w+\.)/$1x/;
。修改后的脚本:
将导致: