首页 > 解决方案 > 转换器 Perl 脚本修复

问题描述

我正在尝试使用一个小的 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 :-\'

脚本有什么问题?

编辑:

以及如何解决?

标签: mysqlregexsqliteperl

解决方案


这是因为你在处理\'之前\\。您需要按照遇到的顺序处理反斜杠,因此您需要一次性完成所有操作。

#!/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


推荐阅读