2010-08-19 27 views
3

我具有类似于此如何在更大的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,而失败。 \(,就在那里,因为搜索吃了那些东西。

如何解决它的任何建议?

回答

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"; 
+0

哇! lookaround完全酷!还有''HERE;'诡计!非常感谢!!! – 2010-08-19 12:55:36