2011-07-11 61 views

Trả lời

14

Hãy coi chừng Unicode, vì điều A-Z thẳng không thực sự di động cho các ký tự khác, chẳng hạn như chữ in hoa có dấu. nếu bạn cần phải xử lý những quá, hãy thử:

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

hoặc chỉ '$ result =() = $ string = ~ m/\ p {Chữ hoa}/g' – ysth

+0

Đẹp nhất, tôi đã quên mẹo đó! –

+2

Hãy nhớ rằng' Chữ hoa' (bí danh 'trên') bao gồm nhiều hơn chỉ đơn thuần là 'Uppercase_Letter' (bí danh' Lu'), mặc dù cái cũ thường là appropirate hơn cái thứ hai, cả hai, tất nhiên, bỏ qua titlecase khi chúng khác biệt với chữ hoa. – tchrist

9

Sử dụng tr điều hành:

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

Đây là một câu hỏi phổ biến và tr hành usually outperforms other techniques.

+1

Chắc chắn, nhưng nếu bạn không quan tâm liệu câu trả lời đó có đúng câu trả lời hay không, tôi có thể thực hiện một chút mã bất kỳ nhanh chóng. ; ( – tchrist

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

Phương pháp one-liner là:

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

này được dựa tắt Stuart Watt's answer nhưng điều chỉnh theo công tip that ysth posted trong các ý kiến ​​để làm cho nó một có thể.

Các vấn đề liên quan