* Dividir la línea por la expresión regular
\w+ quiere decir que tomará a las palabras como separadores y devolverá lo que no es palabra como elementos, y aquí hay que prestar mucha atención a lo que hacemos y cómo funciona todo:
Using perl Syntax Highlighting
$x = "El avion vuela rapido y alto";
print scalar split /\w+/, $x; # 6Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Vemos que sale 6, que parece que son el número de palabras de la línea y creemos que
split ha contado las palabras. Pero veamos exactamente qué es lo que ha dividido
split:
Using perl Syntax Highlighting
$x = "El avion vuela rapido y alto";
print '>' , join('.', split /\w+/, $x), '<'; # >. . . . . <Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Observemos:
- hay 5 espacios, igual que en la frase que le hemos dado
- pero el primer elemento está vacío (es un string vacío) (fijarse que está entre el '>' y el primer '.').
- así que el número de elementos es 6.
Hemos llegado a contar 6 pero, ¿por qué?. Pues porque (primera frase en la documentación de
split) se preservan los posibles campos vacíos que haya al principio y se desechan los del final. Los 'campos' aquí son las no-palabras. Como la frase empieza por una palabra eso quiere decir que delante de ella hay una no-palabra (de longitud 0, pero la hay). Le decimos a split que parte por las palabras, así que la no-palabra del principio es el primer elemento que nos devuelve.
Se verá más claro si la frase empieza por un espacio.
Así que hay que tener cuidado: hemos llegado a la solución, pero hay que entender cómo.
* Para el caso de que el texto tenga varias líneas, has optado primero por la opción de leerlo entero con
@texto=<TEXTO>. Pero luego se lo pasas a
split, y éste te devuelve un 0. ¿Por qué?. Una vez más conviene hacer un análisis minucioso de lo ocurrido:
Using perl Syntax Highlighting
@palabras = split(/(\w+)/,@texto); # Ponemos paréntesis porque queremos que nos devuelva también los delimitadores
print '>',join('.',@palabras),'<'; # >.4<Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Esto es lo que ocurre:
@texto es tomado en contexto escalar, por lo que es un '4' (tiene cuatro elementos, por las cuatro líneas del texto). Y no es eso lo que queremos.
Una solución sería juntar las 4 líneas en una sola con un
join('',@texto), y entonces
split nos devolverá 25 (24 palabras que tiene el texto más la primera invisible).
Y la otra solución es procesar cada línea por separado, por ejemplo con un bucle
foreach por
@texto o un bucle
while por
<TEXTO> y llevar un contador de palabras encontradas en cada línea, para luego pintarlo al final.