2009-09-01 19 views
1

私は単純なPerlスクリプトを使ってXMLを解析し、それを使用可能なSQLに変換しています。現在のSQLの行は、次のようになります。Regexの空白問題

INSERT INTO table VALUES ('data1', 'data2', 'data3',); 

明らかに、最後にカンマを削除する必要があります。シンプルな音が、私はそれを見つける正規表現を取得することはできません。私はs/,\s+\)/\)/を試しましたが、それを実行すると何も変わりません。奇妙なことに、s/,\s+/WTF/は、すべてのカンマとその隣のスペースを置き換える必要がある場合も、何も変更しません。しかし、私がs/\s+\)/something/を実行すると、行末の閉じ括弧が正しく検索され、置き換えられます。だから、カンマの直後の空白文字は、私が決して見つけることができない奇妙なゴースト文字です。 .という表現でさえも。

本当に奇妙ですが、Notepad ++のドキュメントでFindを正規表現オプションで使用すると、,\s+\)と入力してもすべてが完全に見つかりますが、Perl正規表現ではまったく同じシーケンスが見つからないでしょう。

は、私が以前に \n文字を削除したので、それは(私は、Windowsを使用しています) \rで何かをした疑いがあるが、それは全体のSQLファイル内 \rを見つけることができません。

これは本当に私が困惑しているあなたの助けをありがとうございます。

答えて

8

まず第一に、

$ perl -E 'my $foo = "bar, baz"; $foo =~ s/,\s+/WTF/; say $foo' 
barWTFbaz 

それは作業を行います。 (perl 5.8以前は、-eとprint "$foo\n"に変更してください)

第2に、間違っています。あなたがすべき

$values = "'$values[0]', "; 
$values .= "'$values[1]', "; 
⋮ 

:代わりのようなもので行うので

# 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); 
+0

ありがとうございましたpful。 – RobbR

2

何この表現について:

$values = join(q{,}, map("'$_'", @values)); # map adds 'quotes'; join adds commas 

第三に、あなたも、あなたはプレースホルダを使用する必要があり、それを行うべきではありません:

s/,\W+)/)