10

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

4

3 回答 3

16

三个变化:

  • 您必须使用e修饰符来允许替换部分中的表达式。
  • 要进行全局替换,您应该使用g修饰符。如果您每行有一个日期,则不需要这样做。
  • $1在替换端使用,而不是反向引用

这应该有效:

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

此外,如果您的正则表达式包含您正在使用的分隔符(/在您的情况下),最好选择不同的分隔符({}上面),这样您就不必在正则表达式中转义分隔符,从而使您的正则表达式干净。

于 2010-10-15T05:55:17.380 回答
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;
$ 
于 2010-10-15T06:00:48.560 回答
1

这有效:(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;

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

于 2010-10-15T06:04:42.997 回答