sub printN($) { my $format = shift; sub { sprintf $format, @_ } } my %functions = ( -power => sub { exp( $_[0] )}, -log2 => sub { log( $_[0] )/log(2.0) }, -loge => sub { log( $_[0] ) }, -log10 => sub { log( $_[0] )/log(10.0) }, -round => sub { int($_[0] + ($_[0] <=> 0)*0.5) }, -trunc => sub { int $_[0] }, -f1 => printN "%.1f", -f2 => printN "%.2f", -f3 => printN "%.3f", -f4 => printN "%.4f", -f5 => printN "%.5f", ); #### my @func_pipeline = grep {$_} map {$functions{"$_"}} @ARGV; @ARGV = grep {!$functions{"$_"}} @ARGV; #### sub compose($$) { my ($f, $g) = @_; sub { $f->( $g->(@_) ) } } sub id { @_ }; # identity function my $composite_fn = reduce {compose($a,$b)} @func_pipeline, \&id; #### print join ' ', map $composite_fn->($_), split while <>; #### #!/usr/bin/perl -l use strict; use List::Util qw( reduce ); sub printN($) { my $format = shift; sub { sprintf $format, @_ } } sub compose($$) { my ($f, $g) = @_; sub { $f->( $g->(@_) ) } } sub id { @_ }; # identity function my %functions = ( -power => sub { exp( $_[0] )}, -log2 => sub { log( $_[0] )/log(2.0) }, -loge => sub { log( $_[0] ) }, -log10 => sub { log( $_[0] )/log(10.0) }, -round => sub { int($_[0] + ($_[0] <=> 0)*0.5) }, -trunc => sub { int $_[0] }, -f1 => printN "%.1f", -f2 => printN "%.2f", -f3 => printN "%.3f", -f4 => printN "%.4f", -f5 => printN "%.5f", ); my @func_pipeline = grep {$_} map {$functions{"$_"}} @ARGV; @ARGV = grep {!$functions{"$_"}} @ARGV; my $composite_fn = reduce {compose($a,$b)} @func_pipeline, \&id; print join ' ', map $composite_fn->($_), split while <>; #### $ echo 1 2 3 | ./calc-pipeline -f4 -power 2.7183 7.3891 20.0855