use warnings; use strict; use Carp; sub need { my $cond = shift; croak 'require failed' if (!$cond); } sub which_1 { my ($code, $vals) = @_; for my $param (@{$vals}) { if (my $res = eval { &{$code}($param); return 1; }) { return $param; } } croak 'no match'; } my @floors = (1..5); print which_1 sub { my $p = shift; need($p == 3); }, \@floors;