it-swarm-eu.dev

Jak mohu vytěžit první písmeno každého slova v řetězci v Perlu?

Jaký je nejjednodušší způsob, jak využít první písmeno v každém slově řetězce?

25
Dan Littlejohn

Viz faq .

Nemyslím si, že ucfirst () splňuje otázku OP, aby bylo možné využít první písmeno každého slova v řetězci bez rozdělení řetězce a jeho spojení později.

16
piCookie

Jak @brian v komentářích zmiňuje aktuálně přijatou odpověď @piCookie je špatná!

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

To bude tisknout "Co je špatná odpověď?" všimněte si nesprávně aktivovaného S 

Jako FAQ říká, že jste pravděpodobně lepší 

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

nebo Text :: Automatický formát

45
Pat

Podívejte se na funkci ucfirst .

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

Zachycením mezer se vloží do seznamu a použije se k obnovení původní mezery. "ucfirst lc" vydělává "teXT" na "Text".

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

by měla fungovat dobře

6
moritz

Toto vydělává pouze první slovo každého řádku:

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

Všimněte si, že řešení FAQ nefunguje, pokud máte slova, která jsou ve všech verzích a chcete, aby byly (pouze) velké. Můžete buď složitější regex, nebo jen udělat lc na řetězec před použitím řešení FAQ.

1
Karen in Wichita

Můžete použít ' Title Case ', jeho velmi cool kus kódu napsaný v Perlu.

1
vsync

Funkce ucfirst v mapě to určitě dělá, ale pouze velmi rutinním způsobem. Pokud chcete něco trochu sofistikovanějšího, podívejte se na Skript Johna Grubera TitleCase .

0
RET

zkuste to : 

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

Co je to špatná odpověď?

0
bill god