2011-07-11 20 views

Respuesta

14

Cuidado con Unicode, y de la recta Lo A-Z no es realmente portátil para otros caracteres, como letras mayúsculas acentuadas. si usted necesita para manejar estos también, tratar:

my $result = 0; 
$result++ while($string =~ m/\p{Uppercase}/g); 
+6

o simplemente '$ result =() = $ string = ~ m/\ p {En mayúscula}/g' – ysth

+0

Bueno, olvidé ese truco! –

+2

Recuerda que' Mayúscula' (alias 'superior') comprende más que simplemente 'Letra de mayúscula' (alias 'Lu '), aunque la primera es más apropiada que la segunda. Ambas, por supuesto, ignoran el título cuando son distintas de mayúsculas. – tchrist

9

Use el operador tr:

$upper_case_letters = $string =~ tr/A-Z//; 

Esta es una pregunta común y el operador trusually outperforms other techniques.

+1

Bueno, claro, pero si no te importa si obtiene la respuesta correcta o no, puedo hacer que cualquier código sea infinitamente rápido. ; ( – tchrist

2
sub count { 
    $t = shift; 
    $x = 0; 
    for(split//,$t) { 
    $x++ if m/[A-Z]/; 
    } 
    return $x; 
} 
0

El método de una sola línea es:

$count =() = $string =~ m/\p{Uppercase}/g 

Esto se basa apagado Stuart Watt's answer pero modificado de acuerdo con el tip that ysth posted en los comentarios para que sea un uno -transatlántico.

Cuestiones relacionadas