#!/usr/bin/perl use strict; use warnings; my $formula = '((1 + 2) * 2) + (2 * 3)'; my %hash = ('*' => \&mal,            '-' => \&minus,         '+' => \&plus,         '/' => \&div,); while($formula =~ s/\(([^\(]*?)\)/calc($1)/eg){ } print calc($formula); sub calc{  my ($part) = @_;  my ($op1,$op,$op2) = $part =~ m!(\d+)\s*([\*\+\/\-])\s*(\d+)!;  return 0 unless exists($hash{$op});  return $hash{$op}->($op1,$op2); } sub mal{    my ($op1,$op2) = @_;    return $op1 * $op2; } sub minus{    my ($op1,$op2) = @_;    return $op1 - $op2; } sub plus{    my ($op1,$op2) = @_;    return $op1 + $op2; } sub div{    my ($op1,$op2) = @_;    return $op1 / $op2; }