2013年9月13日金曜日

開発環境

『続・初めてのPerl 改訂版』(Randal L. Schwartz, brian d foy, Tom Phoenix 著、伊藤 直也田中 慎司吉川 英興 監訳、株式会社ロングテール/長尾 高弘 訳、オライリー・ジャパン、2006年、ISBN4-87311-305-9)の8章(ファイルハンドルへのリファレンス)の8.6(練習問題)2を解いてみる。

その他参考書籍

2.

コード(BBEdit)

sample.pl

#!/usr/bin/env perl
use strict;
use warnings;
use 5.016;
use utf8;
binmode STDOUT, ':utf8';
binmode STDIN, ':utf8';
binmode STDERR, ':utf8';
use IO::File;

my %names;

my $read_fh = IO::File->new( 'log_file.txt', 'r') or die $!;

while (<$read_fh>) {
    if (/^(.+):/) {
        my $name = lc $1;
        my $write_fh = $names{$name} ||= 
            IO::File->new("$name.info", 'w') ||
            die $!;
        print $write_fh $_;
    }
}

入出力結果(Terminal)

$ ls *.info
ls: *.info: No such file or directory
$ ./sample.pl
$ ls *.info
gilligan.info lovey.info monkeyman.info skipper.info
ginger.info maryann.info professor.info thurston.info
$ cat gilligan.info
Gilligan: 1 coconut
Gilligan: 1 banana
Gilligan: 1 banana
Gilligan: 1 papaya
Gilligan: 1 kiwifruit
Gilligan: 2 mangoes
Gilligan: 1 kiwifruit
Gilligan: 2 kiwifruits
Gilligan: 2 mangoes
Gilligan: 1 mango
Gilligan: 1 kiwifruit
Gilligan: 1 kiwifruit
Gilligan: 1 coconut
Gilligan: 1 coconut
Gilligan: 1 coconut
Gilligan: 1 coconut
Gilligan: 2 papayas
Gilligan: 1 mango
Gilligan: 3 bananas
Gilligan: 1 kiwifruit
Gilligan: 1 papaya
Gilligan: 1 kiwifruit
Gilligan: 1 kiwifruit
Gilligan: 1 banana
Gilligan: 2 bananas
Gilligan: 2 kiwifruits
Gilligan: 4 coconuts
Gilligan: 3 mangoes
Gilligan: 2 coconuts
Gilligan: 2 kiwifruits
Gilligan: 1 kiwifruit
Gilligan: 1 mango
Gilligan: 1 coconut
Gilligan: 1 coconut
$ cat log_file.txt
Gilligan: 1 coconut
Skipper: 3 coconuts
Gilligan: 1 banana
Professor: 3 coconuts
MaryAnn: 2 papayas
Thurston: 2 mangoes
Gilligan: 1 banana
Thurston: 1 mango
Gilligan: 1 papaya
Gilligan: 1 kiwifruit
Skipper: 2 coconuts
Professor: 3 bananas
Ginger: 1 banana
Ginger: 1 mango
Gilligan: 2 mangoes
Ginger: 1 banana
MaryAnn: 1 kiwifruit
Professor: 1 coconut
Professor: 2 coconuts
Gilligan: 1 kiwifruit
Ginger: 1 coconut
MaryAnn: 1 banana
Ginger: 1 banana
Thurston: 1 kiwifruit
Lovey: 1 coconut
Lovey: 2 papayas
Ginger: 2 mangoes
Gilligan: 2 kiwifruits
Skipper: 1 mango
Skipper: 2 mangoes
Lovey: 2 papayas
Gilligan: 2 mangoes
Skipper: 1 kiwifruit
Gilligan: 1 mango
MaryAnn: 2 bananas
Skipper: 1 mango
Gilligan: 1 kiwifruit
Gilligan: 1 kiwifruit
Gilligan: 1 coconut
Professor: 2 mangoes
Gilligan: 1 coconut
Ginger: 3 kiwifruits
Gilligan: 1 coconut
MaryAnn: 1 kiwifruit
Ginger: 2 coconuts
Gilligan: 1 coconut
Gilligan: 2 papayas
Ginger: 3 bananas
Professor: 1 coconut
Gilligan: 1 mango
MaryAnn: 1 kiwifruit
Skipper: 1 mango
MaryAnn: 2 coconuts
Professor: 1 kiwifruit
Maryann: 1 coconut
Gilligan: 3 bananas
Gilligan: 1 kiwifruit
Gilligan: 1 papaya
Lovey: 1 papaya
Ginger: 1 kiwifruit
Gilligan: 1 kiwifruit
MonkeyMan: 8 bananas
Gilligan: 1 kiwifruit
Gilligan: 1 banana
MaryAnn: 1 coconut
Skipper: 3 kiwifruits
MaryAnn: 2 coconuts
Gilligan: 2 bananas
Skipper: 1 coconut
Lovey: 1 coconut
Skipper: 1 banana
Gilligan: 2 kiwifruits
Gilligan: 4 coconuts
Skipper: 1 kiwifruit
Thurston: 1 banana
Lovey: 1 banana
MaryAnn: 2 bananas
Lovey: 1 coconut
Ginger: 1 kiwifruit
Ginger: 1 coconut
Lovey: 1 papaya
MaryAnn: 2 bananas
MaryAnn: 1 mango
Gilligan: 3 mangoes
Skipper: 1 kiwifruit
Professor: 1 papaya
Professor: 1 kiwifruit
Skipper: 1 mango
Thurston: 1 banana
MaryAnn: 1 coconut
Gilligan: 2 coconuts
Gilligan: 2 kiwifruits
MaryAnn: 1 banana
Lovey: 1 banana
Gilligan: 1 kiwifruit
Ginger: 2 coconuts
Gilligan: 1 mango
Lovey: 1 kiwifruit
Skipper: 1 kiwifruit
Lovey: 1 banana
Skipper: 1 mango
Lovey: 1 kiwifruit
Lovey: 2 kiwifruits
Gilligan: 1 coconut
Gilligan: 1 coconut
Skipper: 1 mango
Skipper: 1 coconut
$

ちなみにpython3.3の場合。

コード(BBEdit)

sample.py

#!/usr/bin/env python3.3
## Copyright (C) 2013 by kamimura
#-*- coding: utf-8 -*-

import re

names = {}

with open('log_file.txt') as f:
    for line in f:
        matched = re.search(r"^(.+):", line)
        if matched:
            name = matched.group(1).lower()
            if name in names:
                names[name].write(line)
            else:
                f1 = open('{0}.info'.format(name), 'w')
                f1.write(line)
                names[name] = f1

map(lambda f: f.close(), names.values())

入出力結果(Terminal)

$ ls *.info
ls: *.info: No such file or directory
$ ./sample.py
$ ls *.info
gilligan.info lovey.info monkeyman.info skipper.info
ginger.info maryann.info professor.info thurston.info
$ cat gilligan.info
Gilligan: 1 coconut
Gilligan: 1 banana
Gilligan: 1 banana
Gilligan: 1 papaya
Gilligan: 1 kiwifruit
Gilligan: 2 mangoes
Gilligan: 1 kiwifruit
Gilligan: 2 kiwifruits
Gilligan: 2 mangoes
Gilligan: 1 mango
Gilligan: 1 kiwifruit
Gilligan: 1 kiwifruit
Gilligan: 1 coconut
Gilligan: 1 coconut
Gilligan: 1 coconut
Gilligan: 1 coconut
Gilligan: 2 papayas
Gilligan: 1 mango
Gilligan: 3 bananas
Gilligan: 1 kiwifruit
Gilligan: 1 papaya
Gilligan: 1 kiwifruit
Gilligan: 1 kiwifruit
Gilligan: 1 banana
Gilligan: 2 bananas
Gilligan: 2 kiwifruits
Gilligan: 4 coconuts
Gilligan: 3 mangoes
Gilligan: 2 coconuts
Gilligan: 2 kiwifruits
Gilligan: 1 kiwifruit
Gilligan: 1 mango
Gilligan: 1 coconut
Gilligan: 1 coconut
$

0 コメント:

コメントを投稿