2008-09-16 87 views

回答

14

請參閱the faq

我不相信ucfirst()滿足OP的問題,以便將字符串中每個單詞的第一個字母大寫,而不用拆分字符串並稍後加入。

+1

Err,\ u是通過調用ucfirst在內部實現的,所以你的陳述與你自己的建議相矛盾:-) – 2008-09-16 21:52:58

+0

s /// g開關迭代,所以它執行整個字符串當我第一次看到另一個答案只是「看看ucfirst函數」時,我覺得至少應該提到關於split/join的更多內容,而且我看到編輯過的人員已經包含了這些信息。 – piCookie 2008-09-16 21:55:26

+0

你不想使用你給出的建議,這是常見問題解答使用的代碼來顯示錯誤的方式。在那之後閱讀文本,我解釋了爲什麼答案是錯誤的。 :) – 2008-09-18 06:27:31

10

看看ucfirst函數。

$line = join " ", map {ucfirst} split " ", $line; 
+2

請注意split(「」,$ line)在任意空格上分割,所以不會保留所有空格。 – moritz 2008-10-02 20:00:56

+1

同意;正確的答案是`$ line = join「,map {ucfirst} split//,$ line;`(注意」改爲/) – Ether 2009-10-10 03:21:05

+0

@Ether:更接近,但它仍然去掉_trailing_空格(並且不會只識別由\ t分隔的單詞) – mklement0 2015-10-25 03:55:22

5
$string =~ s/(\w+)/\u$1/g; 

應該只是罰款

0

請注意,如果您有在全部大寫的單詞,你想他們是常見問題的解決方案不工作(只),而不是資本。您可以製作更復雜的正則表達式,或者在應用常見問題解答之前在字符串上執行lc。

46

由於@brian在評論中提到@piCookie目前接受的答案是錯誤的!

$_="what's the wrong answer?"; 
s/\b(\w)/\U$1/g 
print; 

這將打印出「錯誤的答案是什麼?注意錯誤地大寫小號

由於FAQ說你可能會更好過使用

s/([\w']+)/\u\L$1/g 

Text::Autoformat

7
$capitalized = join '', map { ucfirst lc } split /(\s+)/, $line; 

通過捕獲的空白,它被插在列表中,並用於重建原始間距。 「ucfirst lc」將「teXT」改爲「文本」。

1

您可以使用'Title Case',它是一個用Perl編寫的非常酷的代碼。

2

本大寫只有每一行的第一個字:

perl -ne "print (ucfirst($1)$2) if s/^(\w)(.*)/\1\2/" file 
0

試試這個:

echo "what's the wrong answer?" |perl -pe 's/^/ /; s/\s(\w+)/ \u$1/g; s/^ //' 

什麼是錯誤的答案?

相關問題