lines.go en Go
Contar líneas, palabras y bytes como wc, para archivos o stdin.
// Cuenta líneas, palabras y bytes de archivos o stdin, como wc.
package main
import (
"bufio"
"fmt"
"os"
)
type counts struct {
lines, words, bytes int
}
func count(r *bufio.Reader) counts {
var c counts
scanner := bufio.NewScanner(r)
for scanner.Scan() {
line := scanner.Text()
c.lines++
c.bytes += len(line) + 1
inWord := false
for _, ch := range line {
if ch == ' ' || ch == '\t' {
inWord = false
} else if !inWord {
inWord = true
c.words++
}
}
}
return c
}
func main() {
args := os.Args[1:]
if len(args) == 0 {
c := count(bufio.NewReader(os.Stdin))
fmt.Printf("%8d %8d %8d\n", c.lines, c.words, c.bytes)
return
}
var total counts
for _, name := range args {
f, err := os.Open(name)
if err != nil {
fmt.Fprintf(os.Stderr, "skip %s: %v\n", name, err)
continue
}
c := count(bufio.NewReader(f))
f.Close()
fmt.Printf("%8d %8d %8d %s\n", c.lines, c.words, c.bytes, name)
total.lines += c.lines
total.words += c.words
total.bytes += c.bytes
}
if len(args) > 1 {
fmt.Printf("%8d %8d %8d total\n", total.lines, total.words, total.bytes)
}
}
Cómo funciona
bufio.Scannerlee línea por línea.- Un contador de palabras detecta las transiciones a palabra.
- Con varios archivos también imprime una fila de total.
Palabras clave y builtins usados aquí
continueelseforfuncifintlenrangereturnstructtypevar
El intento, en números
- Líneas
- 59
- Caracteres a escribir
- 1041
- Tokens
- 295
- Ritmo de tres estrellas
- 105 tpm
Al ritmo de tres estrellas de 105 tokens por minuto, este intento toma unos 169 segundos.
Paso 1 de 1 en Bis; paso 30 de 30 en Fundamentos del lenguaje.