wc、再び

30分プログラム、その620。昔にやったwcを再実装してみる。
which コマンドの実装の書き直し - forest bookを読んで、昔やったのをもう一度やってみるのもおもしろいかも、と思ったのでやってみる。
前にやったのはwc.py - みずぴー日記と実に2年以上前。
全然変わってないかと思いきや、さすがに変化してた。昔のやつより、コードが短かく、メモリを豪快に使うようになってた。進歩といっていいのかは微妙なとこだと思う。

使い方

$ python wc.py foo
33 88 683 foo

昔の

#!/usr/bin/env python
import sys
import re

def wc(path):
    file = open(path)
    rexp = re.compile(r'\s+')

    size = 0
    lines = 0
    words = 0
    for line in file.readlines():
	size  += len(line)
	lines += 1
	words += len(rexp.split(line.strip()))
    return (lines,words,size,path)

lines = words = size = 0
for path in sys.argv[1:]:
    (l,w,s,path) = wc(path)
    lines += l
    words += w
    size  += s
    print "%8d%8d%8d %s" % (l,w,s,path)
if len(sys.argv) != 2:
    print "%8d%8d%8d total" % (lines,words,size)

ソースコード

#! /usr/bin/python
# -*- mode:python; coding:utf-8 -*-

import sys

def lines(s):
    return len(s.split("\n"))

def words(s):
    return len(s.split())

def chars(s):
    return len(s)

if __name__ == '__main__':
    for path in sys.argv[1:]:
        s = open(path).read()
        print "%d %d %d %s" % (lines(s),
                               words(s),
                               chars(s),
                               path)