如何用 Perl 中的计算表达式替换?
有一个文件 dummy.txt
内容是:
9/0/2010
9/2/2010
10/11/2010
我必须将月份部分(0,2,11)更改为+1,即(1,3,12) 我编写了替换正则表达式,如下所示
$line =~ s/\/(\d+)\//\/\1+1\//;
它正在打印
9/0+1/2010
9/2+1/2010
10/11+1/2010
如何使其在数字上添加 - 3
而不是执行字符串连接? 2+1
??
There's a file dummy.txt
The contents are:
9/0/2010
9/2/2010
10/11/2010
I have to change the month portion (0,2,11) to +1, ie, (1,3,12)
I wrote the substitution regex as follows
$line =~ s/\/(\d+)\//\/\1+1\//;
It's is printing
9/0+1/2010
9/2+1/2010
10/11+1/2010
How to make it add - 3
numerically than perform string concat? 2+1
??
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这个怎么样?
How about this?
三处变化:
e
修饰符允许表达式
更换零件。
您应该使用
g
修饰符。如果每行只有一个日期,则不需要这一点。$1
,而不是反向引用这应该可行:
此外,如果您的正则表达式包含您正在使用的分隔符(在您的情况下为
/
),最好选择不同的分隔符(上面的{}
),这样您就不必转义正则表达式中的分隔符,从而使您的正则表达式变得干净。Three changes:
e
modifierto allow an expression in the
replacement part.
you should use the
g
modifier. This is not needed if you've one date per line.$1
on the replacement side, not a backreferenceThis should work:
Also if your regex contains the delimiter you're using(
/
in your case), it's better to choose a different delimiter ({}
above), this way you don't have to escape the delimiter in the regex making your regex clean.这有效:(
e
是评估替换字符串:请参阅 perlrequick 文档)。如果您的正则表达式本身具有
/
,那么使用!
或其他字符作为分隔符会有所帮助。您还可以使用Can Perl string interpolation Perform any expression中的这个问题评估?
但如果这是一个家庭作业问题,当老师问你如何得出这个解决方案时,准备好解释。
this works: (
e
is to evaluate the replacement string: see the perlrequick documentation).It helps to use
!
or some other character as the delimiter if your regular expression has/
itself.You can also use, from this question in Can Perl string interpolation perform any expression evaluation?
but if this is a homework question, be ready to explain when the teacher asks you how you reach this solution.