Come posso ignorare gli accenti quando si confrontano le stringhe in Perl?
-
23-08-2019 - |
Domanda
Ho questa applicazione quiz in cui abbino quello che la gente tipo con la risposta giusta. Per ora, quello che faccio è fondamentalmente che:
if ($input =~ /$answer/i) {
print "you won";
}
E 'bello, come se la risposta è "pesce" l'utente può digitare "un pesce" e conteggiata una buona risposta.
Il problema che sto affrontando è che, beh, i miei utenti come io sono il francese, e mi piacerebbe essere in grado di accettare, per esempio, un utente che digita "Taton", e la risposta è "TATON".
Allora, che cosa avrei potuto fare, è:
use POSIX qw(locale_h);
use locale;
setlocale(LC_TYPE, "fr_FR.ISO8859-15");
setlocale(LC_COLLATE, "fr_FR.ISO8859-15");
E nella mia routine di controllo, fare una:
$input = lc($input);
$input =~ tr/àáâãäåçèéêëìíîïñòóôõöùúûüýÿ/aaaaaaceeeeiiiinooooouuuuyy/;
e qualcosa lo stesso con la risposta.
Non mi piace, perché devo cose codice rigido, e il giorno decido io sto lasciando il mondo ISO-8859-15 per il mondo UTF-8, io sono condannato.
Quindi, sto cercando un modo per confrontare le stringhe, che farà "tâton" eq "taton"
, "maçon" eq "macon"
o "macon" =~ /maçon/
essere vero.
Soluzione
Prova il Text :: modulo Unaccent da CPAN (o Testo :: :: Unaccent PurePerl ).
Altri suggerimenti
Questo non sembrare una vera e propria occasione per invocare le espressioni regolari - si dovrebbe semplicemente avere una lista di risposte accettabili, oltre a qualche filtro per rimuovere le parole non essenziali come "A", "i", e loro equivalenti specifici della lingua.
Qualunque cosa tu faccia, mi sembra ovvio per me che deve essere di codifica dei caratteri-aware e il linguaggio-aware. Le espressioni regolari sono in genere nessuno.