10

ファイル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??

4

3 に答える 3

16

3 つの変更点:

  • e修飾子を使用して、置換部分で式を許可する必要があります。
  • グローバルに置換するには、g修飾子を使用する必要があります。1 行に 1 つの日付がある場合、これは必要ありません。
  • $1後方参照ではなく、置換側で使用します

これはうまくいくはずです:

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

また、正規表現に使用している区切り文字が含まれている場合 (/あなたの場合)、別の区切り文字 ({}上記) を選択することをお勧めします。この方法では、正規表現で区切り文字をエスケープする必要がなく、正規表現がクリーンになります。

于 2010-10-15T05:55:17.380 に答える
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;
$ 
于 2010-10-15T06:00:48.560 に答える
1

これは機能します: (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;

ただし、これが宿題の質問である場合は、教師がこの解決策にたどり着く方法を尋ねたときに説明できるようにしておいてください。

于 2010-10-15T06:04:42.997 に答える