如何在更大的Perl字符串中查找和增加数字?

时间:2010-08-19 12:32:22

标签: perl

我有与此类似的字符串

INSERT INTO `log_action` VALUES (1,'a',1,4),(2,'a',1,1),(3,'a',4,4),(4,'a',1,1),(5,'a',6,4);

我想在每个第一个值中添加一个数字,所以它变为(当值为10时)

INSERT INTO `log_action` VALUES (11,'a',1,4),(12,'a',1,1),(13,'a',4,4),(14,'a',1,1),(15,'a',6,4);

我试过这个

#!/usr/bin/perl -w
use strict;
my $input;
if ($#ARGV == 0) {
    $input = $ARGV[0];
} else {
    print "Usage: test.pl filename\n\n";
    die "Wrong number of arguments.\n";
}
my $value;
$value = 10;
open(FILE, '<', $input) or die $!;
foreach my $line (<FILE>) {
    if ($line =~ m/^INSERT INTO \`log_action\` VALUES/) {
    $line =~ s/\((\d+),/\($1+$value,/ge;
    print $line . "\n";
    }
}
close FILE;

由于\($1+$value,而失败。 \(,就在那里,因为搜索会吃掉那些。

有任何建议如何解决?

1 个答案:

答案 0 :(得分:9)

你几乎就在那里,但你放在s///e的替换方面的部分需要是有效的Perl。您正在评估Perl代码:

my $string =<<HERE;
INSERT INTO `log_action` VALUES 
(1,'a',1,4),(2,'a',1,1),(3,'a',4,4),(4,'a',1,1),(5,'a',6,4);
HERE

my $value = 10;
$string =~ s/\((\d+),/ '(' . ($1+$value) . ',' /ge;
print "$string\n";

/e计算的Perl代码只是一个字符串连接:

 '(' . ($1+$value) . ','

但是,当我想匹配我不想替换的字符串部分时,我使用lookarounds,因此这些部分不是替换部分:

my $string =<<HERE;
INSERT INTO `log_action` VALUES 
(1,'a',1,4),(2,'a',1,1),(3,'a',4,4),(4,'a',1,1),(5,'a',6,4);
HERE

my $value = 10;
$string =~ s/ (?<=\() (\d+) (?=,) / $1+$value /xge;
print "$string\n";