2017-08-01 2 views
0

J'essaie d'évaluer certaines expressions. J'ai "pqr" & & "xyz" dans la commande. lors de l'évaluation de la commande, une erreur est générée: caractères supplémentaires après la fermeture du devis. Je pense que tcl ne peut pas analyser & & après double citation. Si c'est la raison alors comment dois-je faire face à la double citation et & &?Erreur TCL: caractères supplémentaires après la fermeture de guillemets

+1

Pouvez-vous montrer le code réel qui entraîne une erreur? Ce que vous avez montré ici n'a pas beaucoup de sens puisque "pqr" et "xyz" ne sont pas booléens, donc ils ne peuvent pas être rejoints par &&. –

Répondre

0

Vous ne nous donnez pas assez d'informations.

Une conjecture sauvage est que vous écriviez quelque chose comme ceci:

expr "pqr"&& "xyz" 

qui ne donne le message d'erreur « caractères supplémentaires après la clôture des guillemets ». C'est parce que l'interpréteur essaie d'analyser la commande selon les règles de langage Tcl, et l'une de ces règles est qu'un mot qui commence par une double citation doit se terminer par une double citation correspondante. Dans ce cas, il y a deux caractères & suivant le double guillemet correspondant.

Maintenant,

expr "pqr" && "xyz" 

(avec un espace entre la double citation et l'esperluette) est pas bon non plus. C'est parce que l'interpréteur supprimera tous les caractères qui ont une fonction syntaxique pendant qu'il prépare les arguments pour la commande. Cela signifie que l'argument expr obtient la chaîne pqr && xyz. Lorsque la commande expr s'exécute, elle tente d'interpréter son argument en tant que chaîne dans un langage d'expression spécial qui n'est pas Tcl. En particulier, contrairement aux chaînes Tcl qui ne sont pas des valeurs booléennes ou les noms de variables de fonctions doivent toujours être entourés d'accolades ou de guillemets, comme ceci: "pqr" && "xyz". Alors, comment obtenez-vous cela? Vous * toujours caler l'argument sur expr, c'est comme ça.

expr {"pqr" && "xyz"} 

signifie que expr obtient la chaîne juridique "pqr" && "xyz".

Mais la chaîne "pqr" && "xyz" est toujours pas valide, puisque la && (logique) opération n'est pas définie pour les chaînes autres que les chaînes qui sont égales à la représentation de chaîne de valeurs booléennes, telles que expr {"true" && "false"}

Ainsi, encore une fois nous sommes coincés, parce que ce que vous semblez essayer de faire n'a aucun sens. Si vous nous montrez ce que vous faites, nous pourrions peut-être vous aider.

*) sauf lorsque vous ne devriez pas. Rare, niveau expert.

Documentation: expr, Mathematical operators as Tcl commands, Summary of Tcl language syntax

Brace vos expressions

La commande expr (et, par extension, les commandes for, if et while, qui utilisent le même mécanisme de évaluer leurs conditions) interprète une chaîne d'expression construite à partir de ses arguments.Notez que la langue de la chaîne d'expression n'est pas Tcl mais spécifique à l'évaluateur d'expression de la commande expr: les langages partagent de nombreuses formes syntaxiques, mais sont fondamentalement différents avec infixe, structure basée sur opérateur pour le langage expr et préfixe, basé sur commande. structure pour Tcl.

Laisser l'interpréteur Tcl évaluer les arguments avant de les transmettre à expr peut conduire à

  1. double substitution, qui a des problèmes de sécurité similaires aux attaques par injection SQL.
  2. commandes itératives (for, while) obtenir des arguments de condition à valeur constante, conduisant à des boucles infinies.
  3. toutes les substitutions (et donc leurs effets secondaires) se produisant toujours tandis que expr peut sélectivement supprimer certains d'entre eux.

Par conséquent, il est presque toujours préférable de fournir la chaîne d'expression comme une chaîne, qui ne être évalué par l'interpréteur Tcl contreventement (échappé), seul l'interprète expr. Notez que bien que les arguments non liés à expr puissent être une chaîne d'expression invalide tant que l'évaluation d'argument les transforme en un valide, les expressions entretenues doivent être valides telles quelles (par exemple, les substitutions de variables ou de commandes doivent être des opérandes simples et non des opérateurs ou des expressions complexes).

Un autre avantage de l'utilisation de chaînes d'expression entretenues est que le compilateur d'octets peut généralement générer un code plus efficace (5 à 10 fois plus rapide) à partir d'eux.