Regex 如何用Perl中的计算表达式替换?
有一个文件dummy.txt 内容包括:Regex 如何用Perl中的计算表达式替换?,regex,perl,substitution,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而不是执行字符串concat2+1??三个变化: 您必须使用e修饰符 在 更换零件 在全球范围内进行替换 您应该使
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
而不是执行字符串concat<代码>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;
$
$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
严格使用;
使用警告;
打开我的$fp,“这起作用:(e
用于评估替换字符串:请参阅文档)
它有助于使用如果正则表达式本身具有/
,则使用code>或其他字符作为分隔符
您也可以从中的这个问题使用
但是如果这是一个家庭作业问题,当老师问你如何解决这个问题时,请准备好解释。太棒了!,它成功了-如果你不介意的话,你能解释一下{}语法吗-我的意思是,用s/而不是s{@OP:我已经更新了我的答案。s//
相当于s{}{}
,只是它使用了一个不同的分隔符,可以避免转义那些/
。虽然不是必需的,但对正则表达式使用“x”修饰符可以极大地提高它们的可读性:s{/(\d+/}{'/.($1+1)。'/'}感谢这种方法-我将继续探索perl-我已经接受了另一个答案,因为它只需一行就可以解决问题是的,这些答案肯定更好,我也不知道表达式。感谢您提到分隔符!哦,不,不!不是一个家庭作业问题,我会向您解释-我的解决方案很有效,但我很好ng如果有更好的方法。我正在创建一个数据库,跟踪所有使用过应用程序的用户。身份验证系统是外部的-但是它为每个登录写入一个单独的文件。我试图通过捕获文件创建时间并以SQL Server DATETIME格式插入来获取登录时间。我编写的第一个perl程序ote忽略了这一重要事实——因此大多数日期都是0/0/2010格式(与DATETIME不兼容)。再次运行带有更改的Perl程序代价高昂
$line = '8/10/2010';
$line =~ s!/(\d+)/!('/'.($1+1).'/')!e;
print $line;
$line = '8/10/2010';
$line =~ s!/(\d+)/!("/@{[$1+1]}/")!e;
print $line;