2009-07-25 14 views
6

Sin pasar por todo el rango de caracteres Unicode, ¿cómo puedo obtener una lista de caracteres que tengan una propiedad determinada? En particular, quiero una lista de todos los caracteres que son dígitos (es decir, los que coinciden con /\d/). Miré Unicode::UCD, y es útil para determinar las propiedades de un personaje dado, pero no parece haber una manera de obtener una lista de caracteres que tienen una propiedad fuera de ella.¿Cómo obtengo una lista de todos los caracteres Unicode que tienen una propiedad determinada?

Respuesta

6

La lista de caracteres Unicode para cada clase se genera a partir de la especificación Unicode al compilar Perl, y se almacena normalmente en/usr/lib/perl-YOURPERLVERSION/unicore/lib/gc_sc/

Por ejemplo, la lista de rangos de caracteres Unicode que coinciden con IsDigit (alias \ d) se almacena en el archivo /usr/lib/perl-YOURPERLVERSION/unicore/lib/gc_sc/Digit.pl

+0

Gracias, esto es casi exactamente lo que estaba buscando. Todavía tendré un bucle sobre ellos para construir una lista, pero al menos eso no tomará para siempre y un día. –

0

cuyos caracteres/\ d/coinciden depende totalmente de su implementación de expresiones regulares (aunque se garantizan los estándares 0-9). En el caso de perl, el perl locale utilizado define qué caracteres se consideran alfabéticos y dígitos.

+0

Perl transforma cadenas en UTF-8 antes de ejecutarlos a través del motor de expresiones regulares. Lo único que afecta a la configuración regional de Perl es cómo una cadena de bytes sin formato se transforma en utf8. Una vez que una cadena está en utf8, perl siempre usará la misma definición de IsDigit, independientemente de la configuración regional. – tetromino

0

No hay forma de hacerlo sin iterar a través de todos los personajes. (si crea una cadena enorme con todas ellas y usa una expresión regular, igual debe hacer el ciclo al menos una vez para crear la cadena).

+0

Afortunadamente, parte del proceso de compilación de Perl crea un conjunto de archivos bajo 'unicore' en uno de los directorios lib que ya tienen mucho trabajo por hacer. No sé si son oficiales o no, tengo una pregunta en la lista de Perl 5 Porters para saber si es seguro usarlos. –

1

Incluso mejor que unicore/lib/gc_sc/Digit.pl es unicore/To/Digit.pl. Es un mapeo directo de los caracteres de dígitos Unicode (bueno, realmente sus desplazamientos) a sus valores numéricos. Esto significa que en lugar de:

use Unicode::Digits qw/digit_to_int/; 

my @digits; 
for (split "\n", require "unicore/lib/gc_sc/Digit.pl") { 
    my ($s, $e) = map hex, split; 
    for (my $ord = $s; $ord <= $e; $ord++) { 
     my $chr = chr $ord; 
     push @{$digits[digits_to_int $chr]}, $chr; 
    } 
} 

for my $i (0 .. 9) { 
    my $re = join '', "[", @{$digits[$i]}, "]"; 
    $digits[$i] = qr/$re/; 
} 

puedo decir:

my @digits; 
for (split "\n", require "unicore/To/Digit.pl") { 
    my ($ord, $val) = split; 
    my $chr = chr hex $ord; 
    push @{$digits[$val]}, $chr; 
} 

for my $i (0 .. 9) { 
    my $re = join '', "[", @{$digits[$i]}, "]"; 
    $digits[$i] = qr/$re/; 
} 

O aún mejor:

my @digits; 
for (split "\n", require "unicore/To/Digit.pl") { 
    my ($ord, $val) = split; 
    $digits[$val] .= "\\x{$ord}"; 
} 
@digits = map { qr/[$_]/ } @digits; 
Cuestiones relacionadas