use strict; use warnings; my $command = '@MAC(output,X,Y,8);'; my ($fields) = $command =~ /\@MAC\((.*?)\)/; my ($output, $var1, $var2, $size) = split(/\s*,\s*/, $fields); my @data = map { "$var1$_*$var2$_"} (0 .. $size-1); while (@data > 1) { my @compressed; push @compressed, sprintf("(%s)+(%s)", shift(@data), shift(@data)) while @data; @data = @compressed; } print("$output = $data[0];\n");