line stats regardless of values, nested report templates
authorMischa POSLAWSKY <perl@shiar.org>
Mon, 28 Nov 2022 22:54:33 +0000 (23:54 +0100)
committerMischa POSLAWSKY <perl@shiar.org>
Sat, 3 Dec 2022 11:37:09 +0000 (12:37 +0100)
Additional colon operator just to make optional parts more legible.

barcat

diff --git a/barcat b/barcat
index 0558da6bd0d569d42ef75328d43fb59a17b377b2..fabc9a5d5b8dacd10814d031e812ae78d06f23d5 100755 (executable)
--- a/barcat
+++ b/barcat
@@ -151,7 +151,7 @@ $opt{report} //= join('',
        '${sum+; color(1); $_ .= " total in "}',
        '${count#} values',
        '${lines#; $_ = $_ != @order && " over $_ lines"}',
-       sprintf(' (%s)', join ', ',
+       sprintf('${count: (%s)}', join ', ',
                '${min; color(31)} min',
                '${avg; $opt{reformat} or $_ = sprintf "%0.2f", $_; color(36)} avg',
                '${max; color(32)} max',
@@ -396,21 +396,23 @@ sub show_stat {
                        max => $order[0],
                );
                $vars{avg} = $vars{sum} / @order;
-               print varfmt($opt{report}, \%vars);
        }
-       say '';
+       say varfmt($opt{report}, \%vars);
        return 1;
 }
 
 sub varfmt {
        my ($fmt, $vars) = @_;
        $fmt =~ s[\$\{ \h*+ ((?: [^{}]++ | \{(?1)\} )+) \}]{
-               my ($name, $cmd) = split /\s*;/, $1, 2;
+               my ($name, $op, $cmd) = split /\s*([;:])/, $1, 2;
                my $format = $name =~ s/\+// || $name !~ s/\#// && $opt{reformat};
                local $_ = $vars->{$name};
                defined && do {
                        $_ = $opt{'value-format'}->($_) if $format;
-                       if ($cmd) {
+                       if ($cmd and $op eq ':') {
+                               $_ = varfmt($cmd, $vars);
+                       }
+                       elsif ($cmd) {
                                eval $cmd;
                                warn "Error in \$$name report: $@" if $@;
                        }