use Unicode::Normalize;
($gutted = NFD($string)) =~ s/pM//g;
然而,这几乎总是不正确的做法。你将如何处理?
Ævar Arnfjörð
Dženan Ljubović
King Henry Ⅷ
Carlos Ⅴº, el Emperador
只需采用Unicode即可。正确的匹配带或不带变音符号的方法是实例化一个strength设置为忽略变音符号的Unicode::Collator对象。然后调用cmp或eq方法即可。
编辑
这就是你应该处理这些事情的方式。 见证:
«La Alberguería de Argañán» sí tiene /AN/ en un par de sitios «añ» y «án»
sí tiene /AL/ en un solo sitio «Al»
«Bóveda del Río Almar» sí tiene /AL/ en un solo sitio «Al»
«Cabezón de Liébana» sí tiene /AN/ en un solo sitio «an»
sí tiene /ON/ en un solo sitio «ón»
«Doña Mencía» sí tiene /EN/ en un solo sitio «en»
sí tiene /ON/ en un solo sitio «oñ»
«Gallegos de Argañán» sí tiene /AN/ en un par de sitios «añ» y «án»
sí tiene /AL/ en un solo sitio «al»
«Griñón» sí tiene /IN/ en un solo sitio «iñ»
sí tiene /ON/ en un solo sitio «ón»
«Logroño» sí tiene /ON/ en un solo sitio «oñ»
«Lliçà d’Amunt» sí tiene /UN/ en un solo sitio «un»
«Madroñal» sí tiene /ON/ en un solo sitio «oñ»
sí tiene /AL/ en un solo sitio «al»
«Mantilla» sí tiene /AN/ en un solo sitio «an»
«Mañón» sí tiene /AN/ en un solo sitio «añ»
sí tiene /ON/ en un solo sitio «ón»
«Matilla de los Caños del Río» sí tiene /AN/ en un solo sitio «añ»
«Montalbán de Córdoba» sí tiene /AN/ en un solo sitio «án»
sí tiene /ON/ en un solo sitio «on»
sí tiene /AL/ en un solo sitio «al»
«La Peña» sí tiene /EN/ en un solo sitio «eñ»
«Piñuécar–Gandullas» sí tiene /AN/ en un solo sitio «an»
sí tiene /IN/ en un solo sitio «iñ»
«A Pobra do Caramiñal» sí tiene /IN/ en un solo sitio «iñ»
sí tiene /AL/ en un solo sitio «al»
«Prats de Lluçanès» sí tiene /AN/ en un solo sitio «an»
«Ribamontán al Monte» sí tiene /AN/ en un solo sitio «án»
sí tiene /ON/ en un par de sitios «on» y «on»
sí tiene /AL/ en un solo sitio «al»
«La Roca del Vallès» sí tiene /AL/ en un solo sitio «al»
«San Martín del Castañar» sí tiene /AN/ en un par de sitios «an» y «añ»
sí tiene /IN/ en un solo sitio «ín»
«Santa Eulàlia de Ronçana» sí tiene /AN/ en un par de sitios «an» y «an»
sí tiene /ON/ en un solo sitio «on»
sí tiene /AL/ en un solo sitio «àl»
«Santa María de Cayón» sí tiene /AN/ en un solo sitio «an»
sí tiene /ON/ en un solo sitio «ón»
«Valverde de Alcalá» sí tiene /AL/ en 3 sitios «al», «Al» y «al»
«Villar de Argañán» sí tiene /AN/ en un par de sitios «añ» y «án»
这里是生成该内容的代码。
use utf8;
use 5.10.1;
use strict;
use warnings;
use autodie;
use charnames qw< :full >;
use List::Util qw< max first >;
use Unicode::Collate;
my $INCLUÍR_NINGUNOS = 0;
my $SI_IMPORTAN_MARCAS_DIACRÍTICAS = 0;
sub sí_ó_no(_) { $_[0] ? "sí" : "no" }
sub encomillar(_) {
return join $_[0] =>
"\N{LEFT-POINTING DOUBLE ANGLE QUOTATION MARK}",
"\N{RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK}",
;
}
binmode(STDOUT, ":utf8");
my @ciudades_españolas = ordenar_a_la_española(<<'LA_ÚLTIMA' =~ /\S.*\S/g);
Santa Eulàlia de Ronçana
Mañón
A Pobra do Caramiñal
La Alberguería de Argañán
Logroño
La Puebla del Río
Villar de Argañán
Piñuécar–Gandullas
Mantilla
Gallegos de Argañán
Madroñal
Griñón
Lliçà d’Amunt
Valverde de Alcalá
Montalbán de Córdoba
San Martín del Castañar
La Peña
Cabezón de Liébana
Doña Mencía
Santa María de Cayón
Bóveda del Río Almar
La Roca del Vallès
Matilla de los Caños del Río
Prats de Lluçanès
Ribamontán al Monte
LA_ÚLTIMA
my $cmáx = -(2 + max map { length } @ciudades_españolas);
my @búsquedas = < {A,E,I,O,U}N AL >;
my $bmáx = -(2 + max map { length } @búsquedas);
my $ordenador = new Unicode::Collate::
level => $SI_IMPORTAN_MARCAS_DIACRÍTICAS ? 2 : 1,
normalization => undef,
;
for my $aldea (@ciudades_españolas) {
my $déjà_imprimée;
for my $búsqueda (@búsquedas) {
my @resultados = $ordenador->gmatch($aldea, $búsqueda);
next unless @resultados || $INCLUÍR_NINGUNOS;
printf qq(%*s %s tiene %*s en %17s %s\n),
$cmáx => !$déjà_imprimée++ && encomillar($aldea),
sí_ó_no(@resultados),
$bmáx => "/$búsqueda/",
cuántos_sitios(@resultados),
enfilar(@resultados);
}
}
sub cuántos_sitios {
my @lista = @_;
my $cantidad = @_;
given ($cantidad) {
when (0) { return "ningún sitio" }
when (1) { return "un solo sitio" }
when (2) { return "un par de sitios" }
default { return "$cantidad sitios" }
}
}
sub enfilar {
my @lista = map { encomillar } @_;
my $separador = "\N{COMMA}";
$separador = "\N{SEMICOLON}" if first { /$separador/ } @lista;
$separador .= "\N{SPACE}";
given (scalar @lista) {
when (0) { return "" }
when (1) { return "@lista" }
when (2) { return join " y " => @lista }
default { return
join($separador => @lista[ 0 .. ($#lista-1) ])
. " y $lista[$#lista]";
}
}
}
sub ordenar_a_la_española {
my @lista = @_;
state $ordenador_a_la_española = new Unicode::Collate::
entry => <<'SALIDA',
00E7 ; [.123E.0020.0002.0327]
0063 0327 ; [.123E.0020.0002.0327]
00C7 ; [.123E.0020.0002.0327]
0043 0327 ; [.123E.0020.0002.0327]
0063 0068 ; [.123F.0020.0002.0043]
0043 0068 ; [.123F.0020.0007.0043]
0043 0048 ; [.123F.0020.0008.0043]
006C 006C ; [.1331.0020.0002.004C]
004C 006C ; [.1331.0020.0007.004C]
004C 004C ; [.1331.0020.0008.004C]
00F1 ; [.136E.0020.0002.0303]
006E 0303 ; [.136E.0020.0002.0303]
00D1 ; [.136E.0020.0008.0303]
004E 0303 ; [.136E.0020.0008.0303]
SALIDA
upper_before_lower => 1,
normalization => "NFKD",
preprocess => sub {
my $_ = shift;
s/^L\p{QMARK}//;
s{ ^
(?:
El
| Los
| La
| Las
| Els
| Les
| Sa
| Es
| O
| Os
| A
| As
)
\h +
}{}x;
s/\b[dl]\p{QMARK}//g;
s{
\b
(?:
el | los | la | las | de | del | y
| els | les | i | sa | es | dels
| o | os | a | as | do | da | dos | das
)
\b
}{}gx;
return $_;
},
;
return $ordenador_a_la_española->sort(@lista);
}
$string =~ /$name/
而不是$name =~ /$string/
,以及s|[áa]|a|
而不是s|a|[áa]|
。 - mob$name
中构建一个正则表达式,而不是剥离非英语化字符。 - mob