#!/usr/bin/env perl
use strict;
use warnings;
my @numbers = (19, 42, 23, 4, 10, 23);
my $number = 42;
my %numhash = map { $_, $_ } @numbers;
print "in array\n" if exists $numhash{$number};
«может», запросто, оба варианта вполне perlish. Надо решить что важней, процессор или память, выяснить насколько большой массив. Почти всегда хватает смарт-матчинга или фильтрации массива.
Все варианты в PP жрут немерянно ОЗУ. Если и брать массив чисел от 100 тыс. и более, то только через XS: Bit::Vector, Tie::IntegerArray и т.п. Конечно, пример у ТС даже оптимизировать не надо.
Поскольку задача поставлена в общем виде, то можно использовать любой вариант выше (~~, grep, hash/map). Если нужно будет скорости, глянь Memoize. И если совсем приспичит, то Bit::Vector.
P.S. grep может работать и с операторами, а не только с рекспами, например, grep { $_ == 42 } @numbers.