Как я могу игнорировать акценты при сравнении строк в Perl?

StackOverflow https://stackoverflow.com/questions/386459

Вопрос

У меня есть это приложение для викторины, где я сопоставляю то, что люди вводят, с правильным ответом.На данный момент то, что я делаю, в основном заключается в том, что :

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", и их языковых эквивалентов.

Что бы вы ни делали, мне кажется очевидным, что это должно быть с учетом кодировки символов и языка.Регулярные выражения обычно не являются ни тем, ни другим.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top