Как я могу игнорировать акценты при сравнении строк в Perl? - PullRequest
9 голосов
/ 22 декабря 2008

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

if ($input =~ /$answer/i) {
     print "you won";
}

Это хорошо, как будто ответ «рыба», пользователь может набрать «рыба» и считать хороший ответ.

Проблема, с которой я сталкиваюсь, заключается в том, что мои пользователи, так как я француженка, и я хотел бы иметь возможность принимать, скажем, пользователя, набирающего «taton», а ответ «tâton». 1006 *

Итак, что я мог сделать, это:

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/ истинными.

Ответы [ 2 ]

14 голосов
/ 22 декабря 2008

Попробуйте модуль Text :: Unaccent из CPAN (или Text :: Unaccent :: PurePerl ).

0 голосов
/ 28 января 2009

Это не похоже на подходящий повод для вызова регулярных выражений - у вас должен быть просто список приемлемых ответов, а также некоторая фильтрация для удаления несущественных слов, таких как «a», «the», и их языковых эквивалентов.

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

...