App-LogStats
view release on metacpan or search on metacpan
lib/App/LogStats.pm view on Meta::CPAN
for my $dir ('/etc/', $ENV{STATSRC_DIR}, $ENV{HOME}, '.') {
next unless $dir;
my $file = File::Spec->catfile($dir, $rc_file);
next unless -e $file;
$self->_parse_rc($file => \%config);
}
return \%config;
}
sub _parse_rc {
my ($self, $file, $config) = @_;
open my $fh, '<', $file;
while (<$fh>) {
chomp;
next if /\A\s*\Z/sm;
if (/\A(\w+):\s*(.+)\Z/sm) {
my ($key, $value) = ($1, $2);
if ($key eq 'file') {
push @{$config->{$key}}, $value;
}
else {
$config->{$key} = $value;
}
}
}
close $fh;
}
sub _merge_opt {
my ($self, $config, $argv) = @_;
Getopt::Long::Configure('bundling');
GetOptionsFromArray(
$argv,
'file=s@' => \$config->{file},
'd|delimiter=s' => \$config->{delimiter},
'f|fields=s' => \$config->{fields},
't|through' => \$config->{through},
'di|digit=i' => \$config->{digit},
's|strict' => \$config->{strict},
'no-comma' => \$config->{no_comma},
'tsv' => \$config->{tsv},
'csv' => \$config->{csv},
'more' => \$config->{more},
'cr' => \$config->{cr},
'crlf' => \$config->{crlf},
'rc=s' => \$config->{rc},
'h|help' => sub {
$self->_show_usage(1);
},
'v|version' => sub {
print "stats v$App::LogStats::VERSION\n";
exit 1;
},
) or $self->_show_usage(2);
push @{$config->{file}}, @{$argv};
$self->_validate_config($config);
}
sub _show_usage {
my ($self, $exitval) = @_;
require Pod::Usage;
Pod::Usage::pod2usage($exitval);
}
sub _validate_config {
my ($self, $config) = @_;
if (!$config->{digit} || $config->{digit} !~ m!^\d+$!) {
$config->{digit} = 2;
}
$config->{delimiter} = "\t" unless defined $config->{delimiter};
if ($config->{fields}) {
for my $f ( split ',', $config->{fields} ) {
$config->{field}->{$f} = 1;
}
delete $config->{fields};
}
else {
$config->{field}->{1} = 1;
}
}
sub _main {
my $self = shift;
my $r = +{};
if ( ! IO::Interactive::Tiny::is_interactive(*STDIN) ) {
while ( my $line = <STDIN> ) {
$self->_loop(\$line => $r);
}
}
elsif ( scalar @{ $self->config->{file} } ) {
for my $file (@{$self->config->{file}}) {
open my $fh, '<', $file or die "$file: No such file";
while ( my $line = <$fh> ) {
$self->_loop(\$line => $r);
}
close $fh;
}
}
$self->_after_calc($r);
$self->result($r);
$self;
}
sub _loop {
my ($self, $line_ref, $r) = @_;
my $line = $$line_ref;
print $line if $self->config->{through};
chomp $line;
return unless $line;
$self->_calc_line($r, [ split $self->config->{delimiter}, $line ]);
}
( run in 2.795 seconds using v1.01-cache-2.11-cpan-140bd7fdf52 )