Avant de vous dire ce que vous devez faire droit, regardons ce que vous faites mal:
$char =~ s/.|$/|/g;
Le problème ici est que les deux .
et |
sont métacaractères dans les expressions régulières. Le |
signifie "ou", vous dites donc "correspondre .
ou $
". Vous savez correctement que $
signifie la fin de la chaîne, mais .
signifie "n'importe quel caractère." Il correspond donc immédiatement à un caractère et continue de correspondre immédiatement à un caractère, en changeant ce caractère à |
(les métacaractères ne s'appliquent pas dans la seconde moitié de l'expression s///
), puis il correspond à la fin de la chaîne et ajoute |
là-bas. Ou quelque chose comme ça. Fondamentalement, pas ce que vous voulez arriver.
$char =~ s/[.|]$/|/g;
Eh bien, à l'intérieur []
s, .
et |
arrêt étant métacaractères, mais []
signifie « un de ceux-ci, » si cette expression régulière recherche le caractère avant la fin de la chaîne, et si elle est soit |
ou .
, il le change en |
. Encore une fois, pas ce que vous voulez arriver.
$char = tr/.|//d; # and later add |.
tr
est le mauvais outil pour ce travail. Cela supprimerait tous les caractères .
et |
dans votre chaîne, attendez-vous à ce que vous n'utilisiez pas l'opérateur de correspondance regex =~
, mais l'opérateur d'affectation =
. Certainement pas ce que vous voulez arriver.
Ce que vous voulez est ceci:
$char =~ s/\.\|$/|/;
Nous avons échappé à la fois la .
et la |
avec un \
si Perl connaît « le caractère après la \
est un caractère littéral sans signification particulière * » et correspond à .|
à la fin de votre chaîne et la remplace par |
.
Cela dit, il semble que vous soyez un peu nouveau dans les expressions régulières. Je suis un grand fan de perldoc perlretut
, qui je pense est l'un des meilleurs (sinon le meilleur) introduction aux expressions régulières en Perl. Vous devriez vraiment le lire - les expressions régulières sont un outil puissant dans les mains de ceux qui les connaissent, et un mal de tête puissant pour ceux qui ne les connaissent pas.
Merci ... Les deux "." et "|" n'êtes pas le personnage auquel vous faites référence. J'ai donné ces deux exemples comme "Tibet Unicode charater 0F0B (.) Et OFOD (|). Merci de m'avoir indiqué la documentation de Perl – Cthar
Vous aurez probablement besoin d'utiliser des échappements Unicode pour obtenir le même effet. Je ne sais pas le tibétain, mais je parie que les pages d'expressions rationnelles 'perldoc' traiteront de ce problème à un moment donné –
Le livre d'O'Reilly sur les expressions rationnelles est assez bon aussi –