有一个文件 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
??
有一个文件 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
??
三个变化:
e
修饰符来允许替换部分中的表达式。g
修饰符。如果您每行有一个日期,则不需要这样做。$1
在替换端使用,而不是反向引用这应该有效:
$line =~ s{/(\d+)/}{'/'.($1+1).'/'}eg;
此外,如果您的正则表达式包含您正在使用的分隔符(/
在您的情况下),最好选择不同的分隔符({}
上面),这样您就不必在正则表达式中转义分隔符,从而使您的正则表达式干净。
这个怎么样?
$ 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;
$
这有效:(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;
但如果这是一个家庭作业问题,当老师问你如何达到这个解决方案时,请准备好解释。