2008-09-16 31 views

Respuesta

14

Ver the faq.

No creo que ucfirst() satisfaga la pregunta del OP para poner en mayúscula la primera letra de cada palabra en una cadena sin dividir la cadena y unirla más tarde.

+1

Err, \ U se implementa internamente al llamar a ucfirst, por lo que su afirmación al respecto contradice sus propios consejos. :-) –

+0

El modificador s /// g itera, por lo que hace Cuando vi por primera vez otra respuesta con solo "mirar la función ucfirst", sentí al menos más acerca de la división/unión, se debe mencionar, y veo a la persona que está publicando para incluirla. – piCookie

+0

No desea utilizar el consejo que dio, que es el código que utiliza la pregunta frecuente para mostrar la forma incorrecta de hacerlo. Lea el texto justo después de ese bit donde explico por qué esa respuesta es incorrecta. :) –

10

Eche un vistazo a la función ucfirst.

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

Tenga en cuenta que split ("", $ line) se divide en espacios en blanco arbitrarios, por lo que no conservará todos los espacios en blanco. – moritz

+1

de acuerdo; la respuesta correcta sería '$ line = join" ", map {ucfirst} split//, $ line;' (tenga en cuenta el "changed to /) – Ether

+0

@Ether: Closer, pero aún elimina _trailing_ spaces (y no lo haría reconocer palabras separadas por '\ t' solamente). – mklement0

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

debería funcionar bien

+0

¿No sería esto mayúscula toda la cadena, en lugar de la primera letra de cada palabra? –

+0

@briandfoy: su enlace está roto. Señale esto: http://learn.perl.org/faq/perlfaq4.html#How-do-I-capitalize-all-the-words-on-one-line- –

0

Tenga en cuenta que la solución FAQ no funcionará si tiene palabras que están en todas las tapas y desea que sean (sólo) en mayúscula en su lugar. Puede hacer una expresión regular más complicada, o simplemente hacer un lc en la cadena antes de aplicar la solución de preguntas frecuentes.

+1

La solución de preguntas frecuentes funciona bien porque hay en realidad varias soluciones en las preguntas frecuentes. La mejor solución es Damian's Text :: Autoformat, que resuelve exactamente su problema. –

0

La función ucfirst en un mapa ciertamente hace esto, pero solo de una manera muy rudimentaria. Si quieres algo un poco más sofisticado, echa un vistazo a John Gruber's TitleCase script.

+1

Texto :: Autoformat ya lo hace. Está en perlfaq4 :) –

46

Como @brian menciona en los comentarios la respuesta aceptada actualmente por @piCookie es incorrecta.

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

Esto imprimirá "¿Cuál es la respuesta incorrecta?" notar la S mayúscula erróneamente

A medida que el FAQ dice usted es probablemente mejor usar

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

o Text::Autoformat

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

Al capturar el espacio en blanco, se inserta en la lista y se utiliza para reconstruir el espaciamiento original. "ucfirst lc" escribe "teXT" en "Texto".

+0

No maneja '" bill o'hanlon "'. –

+1

Probablemente quiera usar 'split/(\ W +) /' luego. – kixx

1

Puedes usar 'Title Case', es una pieza genial de código escrita en Perl.

2

Este capitaliza sólo la primera palabra de cada línea:

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

probar esto:

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

¿Cuál es la respuesta equivocada?

Cuestiones relacionadas