2008-09-16 90 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/^ //' 

什么是错误的答案?

相关问题