package Mail::Karmasphere::Parser::Score::Base; use strict; use warnings; use base 'Mail::Karmasphere::Parser::Base'; use Text::CSV; sub new { my $class = shift; my $self = ($#_ == 0) ? { %{ (shift) } } : { @_ }; my $type = $self->{Type}; unless ($type) { $type = lc $class; $type =~ s/.*:://; } $self->{Streams} = [ $type ] unless $self->{Streams}; $self = $class->SUPER::new($self); return $self; } sub _value { my $text = shift; return 1000 unless defined $text; return 1000 unless $text =~ /\S/; return 0+ $text; } sub _parse { my $self = shift; LINE: for (;;) { my $line = $self->fh->getline; return undef unless $line; next if $line =~ /^#/; next unless $line =~ /\S/; chomp($line); my $csv = new Text::CSV(); unless ($csv->parse($line)) { warn "Failed to parse CSV line $line"; next LINE; } my @fields = $csv->fields(); # guess_identity_type does validation, and # the wrapper checks that the record type matches # the stream type, so no further validation is required # here. XXX It would be faster to fix the type here from # $type, and do a single regex to check it. return new Mail::Karmasphere::Parser::Record( s => 0, i => $fields[0], v => _value($fields[1]), d => $fields[2], ); } } 1;