Как я могу найти и увеличить число в большей строке Perl? - PullRequest
3 голосов
/ 19 августа 2010

У меня есть строки, подобные этой

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 Ответ

9 голосов
/ 19 августа 2010

Вы почти там, но часть, которую вы положили в сторону замены 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";

Код Perl, который оценивает /e, представляет собой просто конкатенацию строк:

 '(' . ($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";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...