代码之家  ›  专栏  ›  技术社区  ›  Sekhar

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

  •  10
  • Sekhar  · 技术社区  · 15 年前

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

    3 回复  |  直到 15 年前
        1
  •  16
  •   codaddict    15 年前

    三个变化:

    • 你必须使用 e 修饰语 允许在 更换零件。
    • 在全球范围内进行更换 你应该使用 g 修饰语。这是 如果每行有一个约会,就需要。
    • 你用 $1 在替换端,而不是反向引用

    这应该有效:

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

    另外,如果regex包含您使用的分隔符( / 在您的情况下),最好选择其他分隔符( {} 上面),这样就不必转义regex中的分隔符,从而可以清除regex。

        2
  •  1
  •   Aakash Goel    15 年前

    这个怎么样?

    $ 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;
    $ 
    
        3
  •  0
  •   Community Mohan Dere    9 年前

    本作品: 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;
    

    但是,如果这是一个家庭作业问题,准备好解释老师问你如何解决这个问题。