Как я могу игнорировать акценты при сравнении строк в Perl?
-
23-08-2019 - |
Вопрос
У меня есть это приложение для викторины, где я сопоставляю то, что люди вводят, с правильным ответом.На данный момент то, что я делаю, в основном заключается в том, что :
if ($input =~ /$answer/i) {
print "you won";
}
Это приятно, так как при ответе "рыба" пользователь может ввести "a fish" и быть засчитан как хороший ответ.
Проблема, с которой я сталкиваюсь, заключается в том, что мои пользователи, как и я, являются французами, и я хотел бы иметь возможность принять, скажем, пользователя, набирающего "taton", и получающего ответ "tâton".
Итак, что я мог бы сделать, это :
use POSIX qw(locale_h);
use locale;
setlocale(LC_TYPE, "fr_FR.ISO8859-15");
setlocale(LC_COLLATE, "fr_FR.ISO8859-15");
И в моей процедуре проверки выполните :
$input = lc($input);
$input =~ tr/àáâãäåçèéêëìíîïñòóôõöùúûüýÿ/aaaaaaceeeeiiiinooooouuuuyy/;
и что-то аналогичное с ответом.
Мне это не нравится, потому что мне приходится жестко кодировать вещи, и в тот день, когда я решу, что ухожу из мира ISO-8859-15 в мир UTF-8, я обречен.
Итак, я ищу способ сравнения строк, который сделает "tâton" eq "taton"
, "maçon" eq "macon"
или "macon" =~ /maçon/
будьте правдивы.
Решение
Попробуйте Текст::Без участия модуль из CPAN (или Текст::Без участия::PurePerl).
Другие советы
Это не кажется подходящим поводом для вызова регулярных выражений - у вас должен быть просто список приемлемых ответов плюс некоторая фильтрация для удаления несущественных слов, таких как "a", "the", и их языковых эквивалентов.
Что бы вы ни делали, мне кажется очевидным, что это должно быть с учетом кодировки символов и языка.Регулярные выражения обычно не являются ни тем, ни другим.