如何用Perl中的计算表达式替换?

时间:2010-10-15 05:49:20

标签: regex perl substitution

有一个文件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 ...

3 个答案:

答案 0 :(得分:16)

三个变化:

  • 您必须使用e修饰符 允许表达式 更换部件。
  • 全球更换 你应该使用g修饰符。如果每行有一个日期,则
  • 您在替换方使用$1,而不是使用反向引用

这应该有效:

$line =~ s{/(\d+)/}{'/'.($1+1).'/'}eg;

此外,如果您的正则表达式包含您正在使用的分隔符(在您的情况下为/),最好选择不同的分隔符(上面{}),这样您就不必逃避正则表达式中的分隔符使正则表达式清理。

答案 1 :(得分:1)

这个怎么样?

$ cat date.txt 
9/0/2010
9/2/2010
10/11/2010
$ perl chdate.pl 
9/1/2010
9/3/2010
10/12/2010
$ cat chdate.pl 
use strict;
use warnings;

open my $fp, '<', "date.txt" or die $!;

while (<$fp>) {
    chomp;
    my @arr = split (/\//, $_);
    my $temp = $arr[1]+1;
    print "$arr[0]/$temp/$arr[2]\n";
}

close $fp;
$ 

答案 2 :(得分:0)

这有效:(e用于评估替换字符串:请参阅perlrequick文档。

$line = '8/10/2010';
$line =~ s!/(\d+)/!('/'.($1+1).'/')!e;

print $line;

如果正则表达式本身有!,则有助于使用/或其他字符作为分隔符。


您也可以在Can Perl string interpolation perform any expression evaluation?

中使用此问题
$line = '8/10/2010';
$line =~ s!/(\d+)/!("/@{[$1+1]}/")!e;

print $line;

但如果这是一个家庭作业问题,请准备好解释老师何时会问你如何达成这个解决方案。