2009-09-01 11 views
1

J'utilise un simple script Perl pour analyser XML et le convertir en SQL utilisable. Mes lignes SQL actuelles ressemblent à ceci:Wheatspace malheurs dans Regex

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

Évidemment, j'ai besoin d'enlever la virgule à la fin. Cela semble simple, mais je ne peux pas obtenir regex pour le trouver. J'ai essayé s/,\s+\)/\)/ mais cela ne change rien quand je l'exécute. Étrangement, s/,\s+/WTF/ ne modifie rien non plus, quand il devrait remplacer toutes les virgules et les espaces à côté d'eux. MAIS quand je cours s/\s+\)/something/ il trouve correctement et remplace les parenthèses fermantes à la fin de la ligne. Donc, apparemment, le caractère d'espace blanc juste après les virgules est un étrange personnage fantôme que je ne trouve pas du tout. Pas même avec l'expression .. Ce qui est vraiment bizarre, c'est quand j'utilise Find sur le document dans Notepad ++ avec l'option Regular Expression, il les trouve tous parfaitement quand j'entre ,\s+\) mais la même séquence dans Perl regex ne les trouvera pas.

Je me doutais bien que c'était quelque chose avec \r (j'utilise Windows) depuis je l'ai déjà supprimé les caractères \n mais il ne trouvera pas un \r dans tout fichier sql.

Merci d'avance pour votre aide, cela me laisse vraiment perplexe.

Répondre

8

Tout d'abord,

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

Il fonctionne. (Pour Perl 5.8 et avant, changez-le en -e et print "$foo\n")

Deuxièmement, vous le faites mal. Au lieu de faire quelque chose comme:

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

vous devez faire:

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

Troisièmement, vous ne devriez pas faire même, vous devez utiliser des espaces réservés:

# 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

Merci, c'était très hel pful. – RobbR

2

Qu'en est cette expression :

s/,\W+)/)