tokuhirom's Blog

Re: CSVMapperすごすぎる.

http://hitode909.hatenablog.com/entry/2012/08/01/233613

Perlだとselfって書きまくらないといけないとか,こう呼べるけどなんでこう呼べるのか分からないとか,

ってあるけど、このケースだと $self ってかかなきゃいけないケースというのがおもいつかない。。__PACKAGE__ ならわかるけど。

あと、同等の処理はべつに Perl5 でもシンプルにかけるのであった。

use strict;
use warnings;
use utf8;
use 5.016000;

package CSVMapper {
    use parent qw(Exporter);
    our @EXPORT = qw/column load/;
    our %DAT;
    sub column {
        my ($name, $pos) = @_;
        $DAT{caller(0)}->[$pos] = $name;
    }
    sub load {
        my ($class, $str) = @_;
        my @row = split /,/, $str; # てぬき
        my %retval;
        for (0..@row-1) {
            if (my $name = $DAT{$class}->[$_]) {
                $retval{$name} = $row[$_];
            }
        }
        return \%retval;
    }
}

1;
use warnings;
use utf8;
use 5.016000;
use autodie;

use Data::Dumper;
sub p { say Dumper(@_) }

package MyCSV {
    use CSVMapper;

    column 'name',      0;
    column 'ipaddr',    1;
    column 'file_path', 2;
    column 'time',      3;
}

p(MyCSV->load("name1,127.0.0.1,./tmp/path/to/file.txt,2012/01/01"))