use strict; my %variable; my %operation; $operation{eq} = sub { my ($op1, $op2) = @_; return $op1 eq $op2; }; $operation{ne} = sub { my ($op1, $op2) = @_; return $op1 ne $op2; }; sub evaluate { my ($var,$op,$value) = @_; if (defined $operation{$op}) { my $code = $operation{$op}; return $code->( $variable{$var}, $value ); } else { die "Unknown operator : $op\n"; }; }; $variable{foo} = 'FOO'; $variable{bar} = 'BAR'; my ($var,$op,$val); foreach $var (keys %variable) { foreach $op (keys %operation) { foreach $val ('FOO','BAR','neither') { print "$var $op $val :", evaluate( $var, $op, $val ), "\n"; }; }; };