faire un match sur une chaîne de caractères '\N' [Résolu][Perl] - Perl - Programmation
Marsh Posté le 02-06-2008 à 14:57:15
T'es certain du motif que tu cherches???
Normalement \N est utilisé avec charnames et une constante.
Bon maintenant, si c'est vraiment la chaine de caractère \N que tu cherches, il suffit de faire:
Code :
|
Marsh Posté le 02-06-2008 à 15:17:07
Hello,
Merci pour tes suggestions
Ouaip, je suis certain du motif
Je viens de faire quelques tests supplémentaires.
Si je mets :
Code :
|
ça ne marche pas
Si je mets
Code :
|
ça marche
Le seul défaut, c'est que je ne vérifie pas qu'il n'y a que \N sur la ligne...
Pourquoi est-ce que le ^ et le $ font planter la requête? Y aurait-il des caractères cachés sur la ligne?
a+
Marsh Posté le 02-06-2008 à 15:25:19
Argh, je viens de voir que si je mets "use warnings;" il me dit :
"Unrecognized escape \N passed through in regex"...
Marsh Posté le 02-06-2008 à 15:46:58
Pour être encore plus précis, ceci marche :
if ($champ[1] =~ m/$null_export$/) {
et ceci aussi :
if ($champ[1] =~ m/\\N$/) {
Ce n'est donc que le ^ devant le \N qui pose problème...
Incidemment, si j'utilise m/$null_export$/ ça me met l'erreur "Unrecognized escape..." même si je mets "\\N" dans $null_export alors que si je mets m/\\N$/ je n'ai plus cette erreur...
Marsh Posté le 02-06-2008 à 15:56:52
nan mais y'a un truc que je comprends pas
De ce que je vois tu lis un fichier ligne à ligne, tu splittes et regarde la valeur de ta deuxieme colonne.
Celle-ci doit strictement est identique à '\N' pour que tu déclenches une action.
Pourquoi utiliser une regex plutôt que:
Code :
|
Voir avec un petit coup de chomp si néssaire ( mais je vois pas comment ça pourrait être le cas)
Marsh Posté le 02-06-2008 à 16:16:47
c'est dans une regexp, il faut donc que tu fasses
$null_export = "\\\\N";
avec 4 \ ce que tu n'as pas encore essayé
Ca va faire "\\N" comme valeur dans $null_export
et donc va tester "\N " dans l'expression régulière.
A+,
Marsh Posté le 02-06-2008 à 16:24:42
anapajari -> Oui, c'est à peu près ça, tu as bien compris
Et ton code marche très bien. Comme je le disais au début, il y avait de fortes chances pour que mon code soit pourri et ça s'est avéré être le cas.
Par contre, je fais le même test sur plusieurs dizaines de colonnes, donc j'aimerais mettre le champ testé dans une variable, pour n'appeler que la variable à chaque fois et j'aimerais aussi m'assurer qu'il n'y ait que \N dans le champ parce qu'il n'est pas impossible qu'il y ait un \N dans un champ non null (même si c'est peu probable, j'en conviens ), d'où l'usage de ^ et $.
En fait, je me rends compte qu'il faudrait que je fasse une routine qui teste si un champ est nul et appeler ça à chaque fois plutôt que d'écrire le code du test à chaque fois mais bon, je débute en perl (j'ai commencé la semaine dernière ) et je suis pas développeur de toutes façons, donc je fais toutes les erreurs possibles et même quelques unes qui sont à priori impossibles.
En tout cas merci beaucoup pour ton aide, ça m'a bien fait avancer.
a+
Marsh Posté le 02-06-2008 à 16:26:33
gilou a écrit : c'est dans une regexp, il faut donc que tu fasses |
Hello,
Je viens de voir ton message et je venais de faire exactement ce test : c'est exactement ça.
Je me suis rendu compte que ça ne donnait pas ce que je voulais en faisant un print de ma variable.
Merci beaucoup
a+
Marsh Posté le 02-06-2008 à 16:29:22
Juste pour donner le résultat final, voici ce que donne le code qui fonctionne :
Code :
|
Merci beaucoup pour votre aide à tous les deux.
a+
Marsh Posté le 02-06-2008 à 16:48:47
Rocks a écrit : anapajari -> Oui, c'est à peu près ça, tu as bien compris |
Oui et bien je confirme qu'il est absolument pas utile de faire une regex pour tester une valeur donnée.
Une sub me paraitrait un peu exagéré, aussi définirais-je plutôt une variable:
Code :
|
edit: s'pas bo comment t'as fait
Marsh Posté le 02-06-2008 à 13:57:23
Bonjour,
J'ai un fichier texte (un export sql) dans lequel, par défaut, les champs "null" sont une chaîne de caractères : \N (oui, c'est une chaîne de caractères, pas un caractère de contrôle...).
Dans un script Perl, je souhaite faire une recherche sur cette chaîne de caractères.
Je voudrais, en plus, mettre ce champ dans une variable ($null_export) puisque je le recherche dans plusieurs boucles.
Je n'arrive pas à mettre \N dans cette variable, alors que ça marche nickel si je met une chaîne de caractères quelconque tel que par exemple "toto" (j'ai mis NULL AS 'toto' dans la commande sql).
Mon code est sans doute pourri mais voici ce que j'ai actuellement :
Qu'est-ce que je dois faire pour mettre \N?
Si je mets :
$null_export = "\\N";
ou
$null_export = "\\\N";
ou
$null_export = '\\N';
ou
$null_export = \N;
ça ne marche pas.
Même si je mets ces mêmes champs directement dans l'expression régulière (ex: if ($champ[1] =~ m/^"\\N"$/)), ça ne marche pas non plus.
Je suis à court d'idées et je n'arrive pas à trouver de réponse dans la doc (y'en a trop ).
Qu'est-ce que c'est qui coince dans ce cas?
Merci
a+
Message édité par Rocks le 02-06-2008 à 16:30:23
---------------
J'ai cherché à chercher mais je n'ai rien pu trouver et pourtant, j'avais trouvé.