App-csvtool

 view release on metacpan or  search on metacpan

lib/App/csvtool/Smudge.pm  view on Meta::CPAN

      make => sub ( $param ) {
         my $alpha = 2 ** -$1;
         my $prev;
         return sub ( $new ) {
            return $prev = $new if !defined $prev;
            # $result = ( $prev * ( 1 - $alpha ) ) + ( $new * $alpha )
            #         =  $prev * 1 - $prev * $alpha + $new * $alpha
            return $prev = $prev + $alpha * ( $new - $prev );
         };
      }
   },
   {
      name => "total",
      desc => "Running total",
      make => sub ( $ ) {
         my $total = 0;
         return sub ( $new ) {
            $total += $new;
            return $total;
         }
      }
   },
);

   sub mk_filter ( $name )
   {
      foreach ( @FILTERS ) {
         my $re = $_->{name} =~ s/N$/(\\d+)/r;
         next unless $name =~ qr/^$re$/;
         return $_->{make}( $1 );
      }

      croak "Unrecognised filter name $name";
   }

   # For Commandable's builtin 'help' support
   sub commandable_more_help
   {
      Commandable::Output->printf( "\n" );
      Commandable::Output->print_heading( "FILTERS:" );

      Commandable::Output->printf( "    Each filter should be specified as IDX(,IDX...):FILTER\n" );
      Commandable::Output->printf( "\n" );

      foreach ( @FILTERS ) {
         Commandable::Output->printf( "    %s\n",
            Commandable::Output->format_note( $_->{name}, 1 ) );
         Commandable::Output->printf( "      %s\n",
            $_->{desc} );
      }
   }

   sub run ( $pkg, $opts, $reader, $output )
   {
      my @filters;
      foreach my $spec ( ( $opts->{filter} // [] )->@* ) {
         # TODO: Accept DD-DD,DD-DD,etc... as indexes
         my ( $fields, $filter ) = $spec =~ m/^(\d+(?:,\d+)*):(.*)$/ or
            warn( "Unrecognised --filter spec; expected IDX:FILTER\n" ), next;

         foreach my $idx ( split m/,/, $fields ) {
            $filters[$idx - 1] = mk_filter( $filter );
         }
      }

      while( my $row = $reader->() ) {
         my @data = @$row;

         # Skip header lines
         unless( @data and $data[0] =~ m/^#/ ) {
            foreach my $idx ( keys @filters ) {
               length $data[$idx] and defined $filters[$idx] and
                  $data[$idx] = $filters[$idx]->( $data[$idx] );
            }
         }

         $output->( \@data );
      }
   }
}

=head1 AUTHOR

Paul Evans <leonerd@leonerd.org.uk>

=cut

0x55AA;



( run in 0.891 second using v1.01-cache-2.11-cpan-0c5ce583b80 )