Como posso ignorar acentos ao comparar cordas em Perl?
-
23-08-2019 - |
Pergunta
Eu tenho esta aplicação quiz onde eu corresponder ao que as pessoas digitam com a resposta certa. Por agora, o que eu faço é basicamente isso:
if ($input =~ /$answer/i) {
print "you won";
}
É bom, como se a resposta é "peixe" o usuário pode digitar um "peixe" e ser contado uma boa resposta.
O problema que estou enfrentando é que, bem, meus usuários como eu são francês, e eu gostaria de ser capaz de aceitar, por exemplo, um usuário digitando "Taton", ea resposta ser "Taton".
Então, o que eu poderia fazer, é:
use POSIX qw(locale_h);
use locale;
setlocale(LC_TYPE, "fr_FR.ISO8859-15");
setlocale(LC_COLLATE, "fr_FR.ISO8859-15");
E na minha rotina de verificação, faça um:
$input = lc($input);
$input =~ tr/àáâãäåçèéêëìíîïñòóôõöùúûüýÿ/aaaaaaceeeeiiiinooooouuuuyy/;
e algo da mesma forma com a resposta.
Eu não gosto disso, porque eu tenho que coisas código rígido, e no dia que eu decidir que eu estou deixando o mundo da ISO-8859-15 para o mundo do UTF-8, eu estou condenado.
Então, eu estou procurando uma maneira de comparar strings, que vai fazer "tâton" eq "taton"
, "maçon" eq "macon"
ou "macon" =~ /maçon/
ser verdade.
Solução
Tente o Text :: módulo Unaccent do CPAN (ou Text :: Unaccent :: PurePerl ).
Outras dicas
Esta não parece ser uma ocasião adequada para invocar expressões regulares - você deve simplesmente ter uma lista de respostas aceitáveis, além de alguns filtragem para remover palavras não essenciais como "A", "a", e seus equivalentes específicos do idioma.
Faça o que fizer, parece-me óbvio que ele deve ser-codificação de caracteres-consciente e com reconhecimento de linguagem. As expressões regulares são tipicamente não.