Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何用Perl中的计算表达式替换?_Regex_Perl_Substitution - Fatal编程技术网

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

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修饰符 在 更换零件 在全球范围内进行替换 您应该使

有一个文件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
而不是执行字符串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;