recurse nested braces in report variables
authorMischa POSLAWSKY <perl@shiar.org>
Sun, 20 Nov 2022 23:37:11 +0000 (00:37 +0100)
committerMischa POSLAWSKY <perl@shiar.org>
Tue, 22 Nov 2022 23:06:47 +0000 (00:06 +0100)
barcat

diff --git a/barcat b/barcat
index 6dbddd97910941e84542173cfff807318eaa906a..e02ce4ed09e9c7f47f53e00a7eda3801cb8fdc47 100755 (executable)
--- a/barcat
+++ b/barcat
@@ -383,19 +383,20 @@ sub show_stat {
 
 sub varfmt {
        my ($fmt, $vars) = @_;
-       $fmt =~ s[\$\{ (\w+) (?<cmd>; (?: [^{}]+ | \{.*?\} )*)? \}]{
-               local $_ = $vars->{$1};
+       $fmt =~ s[\$\{( (?: [^{}]++ | \{(?1)\} )+ )\}]{
+               my ($name, $cmd) = split /\s*;/, $1, 2;
+               local $_ = $vars->{$name};
                if (defined) {
                        $_ = $opt{'value-format'}->($_) if $opt{reformat};
-                       if ($+{cmd}) {
-                               eval $+{cmd};
-                               warn "Error in \$$1 report: $@" if $@;
+                       if ($cmd) {
+                               eval $cmd;
+                               warn "Error in \$$name report: $@" if $@;
                        }
                        $_;
                }
                else {
-                       warn "Unknown variable \$$1 in report\n";
-                       "\$$1";
+                       warn "Unknown variable \$$name in report\n";
+                       "\$$name";
                }
        }eg;
        return $fmt;