use Number::Interval; use strict; use warnings; my @x_int = ( Number::Interval->new( Max => 1 ), Number::Interval->new( Min => 1, Max => 3.3 ), Number::Interval->new( Min => 3.3 ), ); my @y_int = ( Number::Interval->new( Max => 2.5 ), Number::Interval->new( Min => 2.5, Max => 3.5 ), Number::Interval->new( Min => 3.5 ), ); my %f; $f{0,0} = 4; $f{1,0} = 6; # . . . $f{0,1} = 3; # . . . for ( # x, y [ 0, 0 ], [ 2, 0 ], [ 0, 3 ], ) { my( $x, $y ) = @$_; my( $xkey ) = grep { $x_int[$_]->contains($x) } 0 .. $#x_int; my( $ykey ) = grep { $y_int[$_]->contains($y) } 0 .. $#y_int; my $z = $f{$xkey,$ykey}; print "( $x $y ) -> $z\n"; }