Конвертер Perl скрипт исправления - PullRequest
0 голосов
/ 22 декабря 2018

Я пытаюсь использовать небольшой сценарий Perl для преобразования операторов SQL INSERT из синтаксиса MySQL в синтаксис SQLite.Но в скрипте есть ошибка, и он не может правильно преобразовать строковые константы в некоторых угловых случаях.

Вот скрипт:

#!/usr/bin/perl
while (<>){
    s/\\'/''/g;                # Use '' instead of \'
    s/\\"/"/g;                 # Use " instead of \"
    s/\\r\\n/\r\n/g;           # Convert escaped \r\n to literal
    s/\\\\/\\/g;               # Convert escaped \ to literal
    s/ auto_increment//g;      # Remove auto_increment
    s/^[UN]*?LOCK TABLES.*//g; # Remove locking statements
    print;
}

Проблема заключается в том, что в случае следующегоСтрока MySQL:

'It doesn\'t work :-\\'

Она генерирует неправильную строку SQLite:

'It doesn''t work :-\''

вместо правильного:

'It doesn''t work :-\'

Что не так в скрипте?

РЕДАКТИРОВАТЬ:

И как это исправить?

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Это потому, что вы обрабатываете \' до \\.Вы должны обрабатывать обратную косую черту в том порядке, в котором они встречаются, поэтому вам нужно сделать все за один проход.

#!/usr/bin/perl

my %escapes = (
   n => "\n",
   r => "\r",
);

while (<>) {
    s{\\([\Wrn])}{ $escapes{$1} // ( $1 eq "'" ? "''" : $1 ) }eg;
    s/ auto_increment//g;
    next if /^(?:UN)?LOCK TABLES/;
    print;
}

Обратите внимание на правильный способ дополнительного соответствия UN.

0 голосов
/ 22 декабря 2018

Первая замена s/\\'/''/g; заменяет последнюю \' на '', поэтому

'It doesn\'t work :-\\'
#                    ^^

становится

'It doesn\'t work :-\''

Я думаю, вы хотите заменить только \'когда за ним не следует несловесный символ \W.

Я использую здесь только 2 соответствующие замены для этого случая

my $str = <<'EOD';
insert into tbl values ('it doesn\'t work :-\\', 42, 33, 'and this doesn\'t work as well :-\\', 1024);
EOD
say "before: ",$str;
$str =~ s/\\'(?!\W)/''/g;
$str =~ s/\\\\/\\/g;
say "after: ",$str;

Выход:

before: insert into tbl values ('it doesn\'t work :-\\', 42, 33, 'and this doesn\'t work as well :-\\', 1024);

after: insert into tbl values ('it doesn''t work :-\', 42, 33, 'and this doesn''t work as well :-\', 1024);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...