use strict; use warnings; while() { s/\@MAC\((\w+),(\w+),(\w+),(\d+)\)/mac($1, $2, $3, $4)/ge; print; } sub mac { my ($res, $x, $y, $n) = @_; $n--; my @mac = map { "($x$_*$y$_)" } 0..$n; while (@mac > 2) { @mac = map { "($mac[$_]+$mac[$_+1])" } grep { !($_ % 2) } 0..$#mac; } "$res = " . join("+", @mac); } __DATA__ @MAC(Output,X,Y,2); @MAC(Result,X,Y,8);