Как в Perl сделать заглавной первую букву каждого слова в строке?

Как проще всего сделать заглавной первую букву в каждом слове строки?


person Dan Littlejohn    schedule 16.09.2008    source источник


Ответы (10)


См. часто задаваемые вопросы.

Я не верю, что ucfirst() удовлетворяет вопрос ОП о том, чтобы сделать первую букву каждого слова в строке заглавной, не разделяя строку и не присоединяя ее позже.

person piCookie    schedule 16.09.2008
comment
Err, \U внутренне реализуется путем вызова ucfirst, поэтому ваше утверждение об этом противоречит вашему собственному совету. :-) - person Aristotle Pagaltzis; 17.09.2008
comment
Переключатель s///g выполняет итерацию, то есть всю строку. Когда я впервые увидел другой ответ, просто взглянув на функцию ucfirst, я почувствовал, что следует упомянуть, по крайней мере, больше о разделении/объединении, и я вижу, что человек, публикующий сообщение, отредактирован, чтобы включить их уже. - person piCookie; 17.09.2008
comment
Вы не хотите использовать совет, который вы дали, который является кодом, используемым в FAQ, чтобы показать неправильный способ сделать это. Прочитайте текст сразу после этого фрагмента, где я объясняю, почему этот ответ неверен. :) - person brian d foy; 18.09.2008
comment
Теперь я изменил FAQ, чтобы удалить неправильный ответ, за который все цепляются, потому что они не читали второй абзац. - person brian d foy; 22.09.2008

Как упоминает @brian в комментариях, принятый в настоящее время ответ @piCookie неверен!

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

Это напечатает "Какой неправильный ответ?" обратите внимание на неправильно написанную заглавную букву S

Как сказано в FAQ, вам, вероятно, лучше использовать

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

или Text::Autoformat

person Community    schedule 02.10.2008

Взгляните на функцию ucfirst.

$line = join " ", map {ucfirst} split " ", $line;
person zigdon    schedule 16.09.2008
comment
Обратите внимание, что функция split( , $line) разбивается на произвольные пробелы, так что это не сохранит все пробелы. - person moritz; 03.10.2008
comment
Согласованный; правильный ответ будет $line = join " ", map {ucfirst} split / /, $line; (обратите внимание на изменение на /) - person Ether; 10.10.2009
comment
@Ether: ближе, но он по-прежнему удаляет конечные пробелы (и не распознает слова, разделенные только \t). - person mklement0; 25.10.2015
comment
Большая проблема заключается в том, что ucfirst на самом деле не переводит строку в нижний регистр. Заглавный регистр не FOO, и это не исправит. - person Evan Carroll; 09.08.2019

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

При захвате пробела он вставляется в список и используется для восстановления исходного интервала. «ucfirst lc» заменяет «текст» на «текст».

person kixx    schedule 08.10.2008
comment
Не обрабатывает "bill o’hanlon". - person Asim Jalis; 30.06.2016
comment
Тогда вы, вероятно, захотите использовать split /(\W+)/. - person kixx; 17.08.2016

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

должно работать нормально

person moritz    schedule 16.09.2008
comment
Разве это не заглавная вся строка, а не 1-я буква каждого слова? - person Nathan Fellman; 18.02.2014
comment
@briandfoy: ваша ссылка не работает. Укажите на это: learn.perl.org/faq/ - person Nathan Fellman; 18.02.2014
comment
Если вы добавите пробел, это может сработать: s/ (\w+)/\u$1/g;. - person HoldOffHunger; 27.08.2018

При этом заглавными буквами пишется только первое слово каждой строки:

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

Обратите внимание, что решение часто задаваемых вопросов не работает, если у вас есть слова, написанные заглавными буквами, и вы хотите, чтобы вместо этого они были (только) заглавными. Вы можете либо сделать более сложное регулярное выражение, либо просто сделать lc в строке, прежде чем применять решение часто задаваемых вопросов.

person Community    schedule 16.09.2008
comment
Решение FAQ работает просто отлично, потому что на самом деле в FAQ есть несколько решений. Лучшим решением является Text::Autoformat Дэмиана, который решает именно вашу проблему. - person brian d foy; 22.09.2008

Вы можете использовать 'Title Case', это очень классный фрагмент кода, написанный на Perl.

person vsync    schedule 25.02.2010

попробуй это :

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

Вывод будет:

What's The Wrong Answer?
person bill god    schedule 24.11.2017

Функция ucfirst на карте, безусловно, делает это, но только очень примитивным образом. Если вы хотите что-то более сложное, взгляните на скрипт TitleCase Джона Грубера.

person RET    schedule 17.09.2008