#!/usr/bin/perl -w use strict; sub arith($); my %h = ( 'add' => '+', 'sub' => '-', 'mul' => '*', 'div' => '/', ); print arith(eval $ARGV[0]), "\n"; sub arith($) { my $a = shift; ref $a ? eval join $h{$a->[0]}, map arith($_), @{$a}[1..$#$a] : $a; } __END__ call it with listrefs: ['add', 3, ['mul', 8, 9], ['sub', ['div', 16, 4], 5]]