Rob*_*bbR 1 regex perl whitespace
我使用一个简单的Perl脚本来解析XML并将其转换为可用的SQL.我当前的SQL行是这样的:
INSERT INTO table VALUES ('data1', 'data2', 'data3', );
Run Code Online (Sandbox Code Playgroud)
显然我需要在那里删除逗号.听起来很简单,但我无法让正则表达式找到它.我尝试过,s/,\s+\)/\)/但是当我运行它时,这并没有改变任何东西.奇怪的s/,\s+/WTF/是,当它应该替换所有逗号和它们旁边的空格时,也不会修改任何内容.但是,当我s/\s+\)/something/正确运行它时,找到并替换行末尾的括号.显然,逗号之后的空白字符是一些奇怪的幽灵角色,我无论如何都找不到.甚至没有.表达.
真正奇怪的是,当我在Notepad ++中使用正则表达式选项在文档上使用查找时,它会在我输入时完全找到所有这些,,\s+\)但是在Perl正则表达式中完全相同的序列将找不到它们.
我怀疑它是\r(我正在使用Windows),因为我以前删除了\n字符,但它不会\r在整个sql文件中找到.
提前感谢您的帮助,这真让我感到困惑.
首先,
$ perl -E 'my $foo = "bar, baz"; $foo =~ s/,\s+/WTF/; say $foo'
barWTFbaz
Run Code Online (Sandbox Code Playgroud)
它确实有效.(对于perl 5.8及之前,将其更改为-e和print "$foo\n")
其次,你做错了.而不是做这样的事情:
$values = "'$values[0]', ";
$values .= "'$values[1]', ";
?
Run Code Online (Sandbox Code Playgroud)
你应该做:
$values = join(q{,}, map("'$_'", @values)); # map adds 'quotes'; join adds commas
Run Code Online (Sandbox Code Playgroud)
第三,你甚至不应该这样做,你应该使用占位符:
# note specifying the column names, its a good idea! Schema change.
my $query = "INSERT INTO table (col1, col2, col3) VALUES (?,?,?)";
my $sth = $dbh->prepare($query);
$sth->execute(@values);
Run Code Online (Sandbox Code Playgroud)