有一个文件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
...
答案 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;
但如果这是一个家庭作业问题,请准备好解释老师何时会问你如何达成这个解决方案。