use strict; use warnings; my %values = ( foo => 3, bar => 4, stuff => 5 ); while( ){ s/<:(KEYWORD):(?:([^:>]+:)?>/ $values{$1} * ($2 || 1) /e; print; } __DATA__ <:foo:4:> <:bar:5:> <:bar:> <:stuff:9:> # OUTPUT: 12 20 4 45