2008-12-22 16 views
9

İnsanların doğru cevabı yazdıkları ile eşleştirdiğim bu sınav uygulamasına sahibim. Şimdilik, ben ne temelde şudur: O, güzelPerl'deki dizeleri karşılaştırırken aksanları nasıl göz ardı edebilirim?

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

cevap "balık", sanki kullanıcı "bir balık" yazabilirsiniz ve güzel bir cevap sayılabilir.

Karşılaştığım sorun şu ki, kullanıcılar Fransızca olduğum için ve "taton" yazan bir kullanıcı ve "tâton" olmanın cevabını kabul etmek istiyorum.

Yani, neler yapabileceğini şöyledir:

use POSIX qw(locale_h); 
use locale; 
setlocale(LC_TYPE, "fr_FR.ISO8859-15"); 
setlocale(LC_COLLATE, "fr_FR.ISO8859-15"); 

Ve onay rutininde

bir yapın: cevapla aynı şekilde

$input = lc($input); 
$input =~ tr/àáâãäåçèéêëìíîïñòóôõöùúûüýÿ/aaaaaaceeeeiiiinooooouuuuyy/; 

ve bir şey.

Bundan hoşlanmıyorum çünkü kodları zorlamam gerekiyordu ve karar verdiğim gün UTF-8 dünyası için ISO-8859-15 dünyasından ayrılıyorum, mahkum oldum.

Yani, "tâton" eq "taton", "maçon" eq "macon" veya "macon" =~ /maçon/ doğru yapacak dizeleri karşılaştırmak için bir yol, arıyorum.

+0

Olumsuz tarafı, kullanıcının "bencil gnomes" yazabilmesi ve yine de doğru olması. –

+0

Bu sadece ve örnek oldu, ve, onlar da her zaman tüm dictionnary yazabilirsiniz :-) – mat

+0

Muhtemelen bazı kelime sınırları orada isteyebilirsiniz: m/\ b $ answer \ b/ –

cevap

0

Bu, normal ifadeleri çağırmak için uygun bir fırsat gibi görünmüyor - yalnızca bir "kabul edilebilir" yanıtlar listesine sahip olmanız ve "a", "" ve "dile özgü eşdeğerleri" gibi ifadesiz sözcükleri kaldırmak için bazı filtrelemelerin olması gerekir. .

Ne yaparsanız yapın, karakter kodlama farkında ve dil farkında olması gerektiğini açık görünüyor. Düzenli ifadeler genellikle değildir.