La préservation de barres obliques inverses en Perl chaînes
Est-il un moyen en Perl pour préserver et d'imprimer toutes les barres obliques inverses dans une variable de chaîne?
Par exemple:
$str = 'a\\b';
La sortie est
a\b
mais j'ai besoin de
a\\b
Le problème ne peut pas traiter la chaîne en aucune façon à échapper à l'inverses, car
J'ai à lire des expressions régulières à partir d'une base de données et ne sais pas dans quelle combinaison et le nombre qu'ils apparaissent et ont pour imprimer exactement comme ils sont sur une page web.
J'ai essayé avec template toolkit et html, et html_entity filtres. La seule façon dont il fonctionne jusqu'à présent est d'utiliser une seule cité ici document:
print <<'XYZ';
a\\b
XYZ
Mais je ne peux pas interpoler les variables, ce qui rend cette solution inutile.
J'ai essayé d'écrire une chaîne à une page web, dans un fichier et sur la coque, mais pas de chance, toujours une barre oblique inverse disparaît. Peut-être que je suis totalement sur la mauvaise voie, mais est-ce la bonne façon d'imprimer des complexes, des expressions régulières, y compris les barres obliques inverses dans toutes les combinaisons et les numéros sans aucune modification?
En d'autres termes:
J'ai une base de données contenant des centaines d'expressions régulières, comme la chaîne de données. Je veux les lire avec perl et de les imprimer sur une page web exatly comme ils sont dans la base de données.
Il y a tout le temps des modifications à ces expressions régulières par de nombreux administrateurs, donc je ne sais pas à l'avance comment et quoi de s'échapper.
Un exemple typique pourrait ressembler à ceci:
'C:\\test\\file \S+'
mais ça pourrait changer le lendemain à
'\S+ C:\\test\\file'
Peut-être une conclusion correcte serait de s'échapper de chaque barre oblique inverse exactement une fois dans n'importe quelle combinaison et dans le nombre de qui il s'affiche? Cela signifie qu'il fonctionne à double vers le haut. Alors le problème n'est pas aussi grand que je le craignais. Je l'ai testé sur le bash et il fonctionne avec deux et même trois barres obliques inverses dans une rangée (4 backslaches imprimer 2 et 6 barres obliques inverses d'impression 3).
- Veuillez donner un exemple de ce que vous voulez faire. Une fois les barres obliques inverses sont dans une variable qu'ils restent intacts, et apparaîtra correctement si elles sont interpolées dans une chaîne de caractères. Le seul moyen de mettre une paire de barres obliques inverses dans un littéral de chaîne est à double, mais qui ne devrait pas être un problème. Il y a plusieurs couches logicielles qui considèrent barre oblique inverse pour être un caractère d'échappement, de sorte que votre problème ne peut pas être à l'intérieur de Perl.
Vous devez vous connecter pour publier un commentaire.
La barre oblique inverse seul a de l'importance pour Perl lorsqu'il se produit dans le code source Perl, par exemple: l'attribution d'une chaîne littérale à une variable:
Toutefois, si vous de lire les données à partir d'un fichier (ou une base de données ou d'une douille, etc) les barres obliques inverses dans les données vous lire sera conservé sans que vous ayez à faire quelque chose de particulier.
Ce imprime
a\\b
.Utilisation
my $str = 'a\\b";
au lieu de cela
C'est un pain PITA, mais il vous suffira de doubler les barres obliques inverses, par exemple
Sinon, vous pouvez stocker la barre oblique inverse dans une autre variable, et d'interpoler que.
Le minimum pour obtenir de deux barres obliques est (malheureusement) trois barres obliques:
Le problème j'ai essayé de résoudre n'existe pas. J'ai confondu l'initialisation d'une chaîne directement dans le code en utilisant les formulaires html. À l'aide d'une ficelle à l'intérieur du code de la préservation de tous les anti-slash n'est possible, soit avec un ici document ou par la lecture d'un fichier texte contenant la chaîne de caractères. Mais si je viens d'utiliser le formulaire html sur une page web pour insérer une chaîne de caractères et l'utilisation escapeHTML() du module CGI, il prend soin de tous et vous pouvez les insérer le plus connecté de combinaisons de caractères spéciaux. Ils sont tous affichés et préservé exactement comme inséré. Donc, j'aurais du commencer directement avec le html et les opérations de base de données au lieu d'essayer d'examiner les choses d'abord
en utilisant des chaînes de caractères directement dans le code. De toute façon, merci pour votre aide.
Vous pouvez utiliser l'expression régulière suivante à la forme de votre chaîne correctement:
Ce imprime
a\\b
.EDIT:
Vous pouvez utiliser l'interpolation de la place:
Cette affiche toujours
a\\b
.Subvention de réponse de l'indice dont j'avais besoin. Certains des autres réponses ne correspondent pas du Perl sur mon système ...
Appelé à partir de bash ... à l'aide de la fête de moyens de sortir dans les citations qui change \' à '\".
La dernière ligne, avec six barres obliques inverses dans le milieu, était ce que j'avais prévu. La réalité était différente.
Donc: