Как мне заменить оцененное выражение в Perl? - PullRequest
10 голосов
/ 15 октября 2010

Есть файл 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 ]

16 голосов
/ 15 октября 2010

Три изменения:

  • Вам придется использовать модификатор e чтобы позволить выражение в запасная часть.
  • сделать замену глобально Вы должны использовать модификатор g. Это , а не необходимо, если у вас одна дата в строке.
  • Вы используете $1 на стороне замены, а не обратную ссылку

Это должно работать:

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

Также, если ваше регулярное выражение содержит используемый вами разделитель (/ в вашем случае), лучше выбрать другой разделитель ({} выше), так что вам не нужно экранировать разделитель в регулярное выражение делает ваше регулярное выражение чистым.

1 голос
/ 15 октября 2010

Как насчет этого?

$ 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;
$ 
0 голосов
/ 15 октября 2010

это работает: (e для оценки замещающей строки: см. Документацию perlrequick ).

$line = '8/10/2010';
$line =~ s!/(\d+)/!('/'.($1+1).'/')!e;

print $line;

Это помогает использовать ! или какой-либо другой символ в качестверазделитель, если ваше регулярное выражение имеет /.


Вы также можете использовать из этого вопроса в Может ли интерполяция строк Perl выполнить любую оценку выражения?

$line = '8/10/2010';
$line =~ s!/(\d+)/!("/@{[$1+1]}/")!e;

print $line;

но если это домашнее задание, будьте готовы объяснить, когда учитель спросит вас, как вы достигаете этого решения.

...